在可变参数模板模板参数中使用默认模板参数

时间:2016-06-06 14:03:48

标签: c++ c++11 variadic-templates icc template-templates

我发现下面的最小例子适用于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> F = C应该是有效的构造。

1 个答案:

答案 0 :(得分:4)

我相信这是一个gcc / clang错误。这与[仍然开放] CWG Issue 150有关。提供的理由包括:

  

模板模板参数的参数允许使用默认参数,仅在模板定义中模板模板参数的特化中考虑这些默认参数; 忽略模板模板参数参数的任何默认参数

模板模板参数F没有任何默认参数 - 并忽略C的默认参数。因此,正如ICC所建议的那样,我们应该最终形成一个不完整的专业化。

在问题中提供的示例中,gcc和clang似乎都实现了规则(既不允许调用f(),也都通过Mark Mitchell的operator float()路径示例。