Variadic模板构造函数优先级

pla*_*cel 5 c++ c++11

鉴于以下简单 struct

template <typename T>
struct A
{
   A(T a) {}

   template <typename ... Ts>
   A(T a, Ts ... more) {}
};

int main()
{
   A<int> a(1);
}
Run Code Online (Sandbox Code Playgroud)

什么是A(T a)将被调用而不是可变参数模板构造函数的保证,为什么?

Ric*_*ges 6

您正在寻找的标准部分是§14.8.2.4

如果A是从函数参数包转换而P不是参数包,则类型推导失败.否则,使用得到的类型P和A,然后按照14.8.2.5中的描述进行推导.如果P是函数参数包,则将参数模板的每个剩余参数类型的类型A与函数参数包的declarator-id的类型P进行比较.每个比较都推导出函数参数包扩展的模板参数包中后续位置的模板参数.如果对于给定类型的推导成功,则参数模板中的类型被认为至少与参数模板中的类型一样专用.

[例如:

template<class... Args> void f(Args... args); // #1
template<class T1, class... Args> void f(T1 a1, Args... args); // #2
template<class T1, class T2> void f(T1 a1, T2 a2); // #3
f(); // calls #1
f(1, 2, 3); // calls #2
f(1, 2); // calls #3; non-variadic template #3 is more
// specialized than the variadic templates #1 and #2
Run Code Online (Sandbox Code Playgroud)

- 结束例子]