给出以下简单的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)
将被调用而不是可变参数模板构造函数,以及为什么?
答案 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&)
相比,T
与int
相比可以推导为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];
}
}
}
推断为空列表是一个函数模板特化。