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の場合、変数から渡されたタイプと関数内で渡されたタイプが異なる場合、どちらのタイプが選択されますか:関数の1つ、または変数の1つ?

4

1 に答える 1

5

(2) は、宣言される前にTデフォルトのテンプレート引数で使用されるため、形式が正しくありません。T1残りは整形式です。

(3) と (4) ではT、関数の引数から推定する必要がTある場合は、それが使用される各場所で同じ型に推定する必要があります。つまり、最初の関数パラメーターでの使用から 1 つの型であると推定され、2 番目の関数パラメーターでの使用から別の型であると推定される場合、推定は失敗し、使用は不適切な形式になります。

(5) では、デフォルトの引数 forT1は使用されません。特殊化が使用されるときに実際の引数が指定されるか、テンプレート引数が関数引数から推定されますx

(6) について特別なことは何もありません: すべてのテンプレート引数が関数引数から推定される場合、テンプレート引数が宣言される順序は無関係です。

于 2012-11-06T21:10:15.400 に答える