以下の最小限の例は、gcc と clang、さらには Visual Studio でも動作しますが、icc ではコンパイルされないことがわかりました。これが有効な C++ であるかどうかを判断しようとしていますが、これはいくつかの異なる概念が組み合わされているため、私の質問に答える標準の関連部分を見つけることができません。
// struct with multiple template parameters
template<typename A, typename B = int>
struct C
{
};
// struct that tries to use C's default second parameter without specifying it
template<typename D, template<typename E, typename ...> class F>
struct G
{
F<D> h;
};
int main()
{
G<char, C> i;
}
icc (16.0.3) を使用すると、コンパイルで次のエラーが発生します。
struct.cpp(12): error: too few arguments for template template parameter "F"
F<D> h;
detected during instantiation of class "G<D, F> [with D=char, F=C]" at line 17
これは有効な C++ ですか?
C
2 番目のテンプレート パラメータのデフォルト値があり、 with が有効な構造であることを意味するF<D>
ためF = C
、そうあるべきだと私には思えます。