7

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?
4

1 に答える 1