rya*_*yan 9 c++ icc template-templates variadic-templates c++11
我发现下面的最小例子适用于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;
}
Run Code Online (Sandbox Code Playgroud)
使用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
Run Code Online (Sandbox Code Playgroud)
这是有效的C++吗?
对我来说似乎应该是,因为C它的第二个模板参数有一个默认值,这意味着F<D>with F = C应该是一个有效的结构.
我相信这是一个 gcc/clang 错误。这与 [仍待解决] CWG 第 150 期有关。提供的理由包括:
模板模板参数的参数允许使用默认实参,并且在模板定义中模板模板参数的特化中将单独考虑这些默认实参;模板参数的任何默认参数都将被忽略。
模板模板参数F没有任何默认参数 - 并且 的默认参数C将被忽略。因此,正如 ICC 所建议的那样,我们最终应该得到一个不完善的专业化。
在该问题提供的示例中,gcc 和 clang 似乎都实现了该规则(都不允许调用f()并且都经过operator float()Mark Mitchell 示例中的路径。
| 归档时间: |
|
| 查看次数: |
592 次 |
| 最近记录: |