C++模板,vector.size在默认参数definitoin中使用

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)

Naw*_*waz 7

是否可以在默认参数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)


Mik*_*our 5

不可以.一般来说,函数参数不能在函数体外使用,具体不能在另一个参数的默认值中使用.

您可以通过重载获得相同的效果:

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)