根据标准,以下内容是完善的:
// 1 : Deduced template parameter in the normal order
template<typename T, typename T1 = typename std::conditional<std::is_fundamental<T>::value, T, int>::type>
void f(T x);
// 2 : Deduced template parameter in the inverted order
template<typename T1 = typename std::conditional<std::is_fundamental<T>::value, T, int>::type, typename T>
void f(T x);
// 3 : Deduced template parameter before a function pointer
template<typename T>
void f(T x, void(*g)(int, int, T*));
// 4 : Deduced template parameter after a function pointer
template<typename T>
void f(void(*g)(int, int, T*), T x);
// 5 : Deduced template parameter with inversed variables
template<typename T, typename T1 = typename std::conditional<std::is_fundamental<T>::value, T, int>::type>
void f(T1 x, T y);
// 6 : Inverted deduced parameter
template<typename T, typename T1>
void f(T1 x, T y);
在3和4的情况下,如果从变量和函数内部传递的类型不同,将选择哪种类型:函数之一,还是变量之一?
答案 0 :(得分:5)
(2)格式错误,因为T
在声明之前在T1
的默认模板参数中使用。其余的都很好。
在(3)和(4)中,如果必须从函数参数中推导出T
,那么T
必须在每个使用它的地方推导出相同的类型。也就是说,如果推断它是在第一个函数参数中使用的一种类型,并推导出与在第二个函数参数中使用的类型不同的类型,则扣除失败并且使用形式不正确。
在(5)中,永远不会使用T1
的默认参数 - 在使用特化时将指定实际参数,或者从函数参数{{1推导出模板参数}}
(6)没有什么特别之处:如果所有模板参数都是从函数参数中推导出来的,那么声明模板参数的顺序是无关紧要的。