2

以下内容符合标准:

// 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 种情况下,如果从变量和函数内部传递的类型不同,将选择哪种类型:函数的类型,还是变量的类型?

4

1 回答 1

5

(2) 格式不正确,因为在声明它之前T在默认模板参数中使用了T1它。其余的都很好。

在 (3) 和 (4) 中,如果T必须从函数参数中推导出来,那么T在使用它的每个地方都必须推导为相同的类型。也就是说,如果从它在第一个函数参数中的使用推断为一种类型,并从它在第二个函数参数中的使用推断为不同类型,则推断失败并且使用格式错误。

T1在 (5) 中,永远不会使用默认参数 for —— 要么在使用特化时指定实际参数,要么从函数参数中推导出模板参数x

(6) 没有什么特别之处:如果所有的模板参数都是从函数参数推导出来的,那么声明模板参数的顺序是无关紧要的。

于 2012-11-06T21:10:15.400 回答