模板化构造函数中的模板参数数

Number of template arguments in templated constructor

本文关键字:参数 数数 构造函数      更新时间:2023-10-16

对于一个(可能是非模板化的)类,我可以有一个模板化的构造函数:

struct A {
    template<class T> A(T const& arg) {}
}

模板参数的数量是否受到可以推导的参数数量的限制?如果是,相关的标准报价是什么?

例如,如果构造函数是

template<class T1, class T2> A(T2 const& arg) {}

该调用将导致编译错误

A<int>(double()); // creation of a temporary

或者我该如何调用构造函数?这也会失败:

A::A<int>(double()); // creation of a temporary

标准中有一条注释,即不能在构造函数中使用显式模板参数:

[注意:由于显式模板参数列表跟随函数模板名称,并且因为转换成员函数模板和构造函数成员函数模板被调用如果不使用函数名,就无法为这些函数提供显式的模板参数列表函数模板--尾注]

来源:N3337草案中的14.5.2 Member templates

当然,你可以拥有比构造函数参数更多的构造函数模板参数——只要它们可以从构造函数参数中推导出来:

示例:

struct A {
    template<class T, int N> A(T (&arg)[N]) {}
};

不能使用模板参数列表语法传递类型这一事实并不一定意味着你根本不能传递模板构造函数的类型列表:

template <typename...>
struct _ {};
struct A
{
    template <class T1, class T2, class T3>
    A(_<T1, T2, T3>) {}
};
int main()
{
    A a{_<int, double, char>{}};
}

现场演示