C++標準14.8.2 $ 7と言う:置換が関数型で、テンプレートのパラメータ宣言で使用されているすべてのタイプと表現で発生しテンプレートの引数控除で置換はどのように機能しますか?
。式には、配列境界や非形式テンプレート引数として表示される定数式だけでなく、
sizeof
,decltype
などの一般的な式(非定数式)、および非定数式を許可するその他のコンテキストが含まれます。置換は字句順に進行し、控除が失敗する条件が発生したときに停止します。 [注:例外指定の等価置換は、例外指定がインスタンス化されたときにのみ行われます。置換が無効な型または式になると、プログラムは不正です。 - エンドノート]
標準は、ここでは例を提供します。
template <class T> struct A { using X = typename T::X; };
template <class T> typename T::X f(typename A<T>::X);
template <class T> void f(...) { }
template <class T> auto g(typename A<T>::X) -> typename T::X;
template <class T> void g(...) { }
void h() {
f<int>(0); // OK, substituting return type causes deduction to fail
g<int>(0); // error, substituting parameter type instantiates A<int>
}
g<int>(0)
を呼び出すことはここでエラーであるのはなぜ?トレーリングリターン型T::X
は置換に失敗しますか?テンプレート機能f
とg
の違いは何ですか?
戻り値の型は関数シグネチャの一部としてカウントされますが、パラメータはカウントされません。 – Barry
@Barry戻り値の型とパラメータの両方が関数の署名の一部とみなされると思います。 – Carousel
@Barryこれらは両方とも関数テンプレートの署名の一部ですが、ここでは「署名」は使用しないでください。 –