jus*_*tik 3 c++ parameters templates default definition
有结构TA
template <typename T>
struct TA
{
typedef std::vector <T> Type;
};
Run Code Online (Sandbox Code Playgroud)
和test()函数具有类型TA的默认参数.
template <typename T>
void test ( typename TA<T>::Type a1,
typename TA<T>::Type a2 = typename TA<T>::Type(a1.size()) )
{}
Run Code Online (Sandbox Code Playgroud)
是否可以在默认参数a2定义中使用a1.size()?
int main()
{
TA <double> ::Type a1;
test<double>(a1);
}
Run Code Online (Sandbox Code Playgroud)
是否可以在默认参数a2定义中使用a1.size()?
不可以.标准禁止这样做.您不能使用函数参数来设置其他参数的默认值.
§8.3.6/ 9(C++ 03)明确指出,
每次调用函数时都会计算默认参数.函数参数的评估顺序未指定.因此,函数的参数不应在默认参数表达式中使用,即使它们未被计算.
所以解决方案是:使用过载:
template <typename T>
void test(typename TAs<T>::Type a)
{
test(a, typename TA<T>::Type(a.size()));
}
Run Code Online (Sandbox Code Playgroud)
不可以.一般来说,函数参数不能在函数体外使用,具体不能在另一个参数的默认值中使用.
您可以通过重载获得相同的效果:
template <typename T>
void test ( typename TAs<T>::Type a1, typename TA<T>::Type a2);
template <typename T>
void test ( typename TAs<T>::Type a1)
{
test(a1, typename TA<T>::Type(a1.size()));
}
Run Code Online (Sandbox Code Playgroud)