Variadic模板构造函数优先级

时间:2016-03-27 00:36:27

标签: 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);
}

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

2 个答案:

答案 0 :(得分: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
     

- 结束示例]

答案 1 :(得分:2)

f(const int&)f(const T&)相比,Tint相比可以推导为A(int)A(int, Ts...)是一个非模板函数,Ts...是一个非模板函数{} {1}} public class BucketSort { public static void main(String args[]) { int intArray[] = {22, 45, 12, 8, 10, 6, 72, 81, 33, 18, 50, 14}; int eachBucket[][] = new int[10][11]; int j; double max = 81; int min = 6; int divider = (int)Math.ceil((max + 1) / 10); for(int i = 0; i < intArray.length; i++) { j = (int)Math.floor(intArray[i] / divider); eachBucket[j][i] = intArray[i]; } } } 推断为空列表是一个函数模板特化。