T
次のように、別のテンプレートのダミー パラメーター内で別のテンプレートg
(enable_if
たとえば、式など) で型を検証する必要がある場合を考えてみましょう。
template<class> struct g { typedef void type; };
template<class, class> struct f {};
template<class T> struct f<T, void> {}; // Case A
template<class T> struct f<T*, typename g<T>::type> {}; // Case B
int main() { f<int*, void> test; }
ここでは、簡単にするために、g
実際には何もしません。ケース Bの 2 番目のパラメーターは推定されないコンテキストにあるため、直感的にケース Bはケース Aよりも特殊化されていると考えることができます。悲しいことに、gcc と clang の両方が、上記のインスタンス化ではテンプレートがあいまいであると文句を言います。
ダミー パラメータを削除すると、問題なくコンパイルされます。推定されていないパラメータを追加すると、T*
より専門化された合理的な期待がどのように破壊されるのT
でしょうか?
以下は、置換アルゴリズムを使用した簡単なチェックです。
f<Q , void >
-> f<T*, g<Q>::type> // [failed]
f<Q*, g<Q>::type>
-> f<T , void > // [to fail or not to fail?]
// One would assume that 2nd parameter is ignored, but guess not?