我发现下面的最小示例适用于 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
它的第二个模板参数有一个默认值,这意味着F<D>
withF = C
应该是一个有效的结构。