C++模板,vector.size用于默认参数定义

C++ templates, vector.size used in default parameter definitoin

本文关键字:默认 参数 定义 用于 size 模板 vector C++      更新时间:2023-10-16

有一个结构TA

template <typename T>
struct TA
{
    typedef std::vector <T> Type;
};

以及test()函数,该函数具有TA类型的默认参数。

template <typename T>
void test ( typename TA<T>::Type a1, 
            typename TA<T>::Type a2 = typename TA<T>::Type(a1.size()) )
{}

是否可以在默认参数a2定义中使用a1.size()?

int main()
{
    TA <double> ::Type a1;
    test<double>(a1);
}

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

否。通常,函数参数不能在函数体之外使用,特别是不能在另一个参数的默认值中使用。

你可以通过超载得到同样的效果:

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()));
}