非命名空间作用域中的显式特化不在GCC中编译

时间:2018-04-07 12:03:09

标签: c++ templates gcc language-lawyer bug-reporting

以下代码在Clang中编译,但在GCC中不编译:

template<typename T>
struct Widget
{
    template<typename U>
    void foo(U)
    {
    }

    template<>
    void foo(int*)
    {
    }
};

根据C ++标准([temp.expl.spec],第2段):

  

可以在相应主模板可能的任何范围内声明显式特化   定义

这是GCC中的错误吗?如果是这样,我怎样才能在其错误跟踪器中找到它?

这是GCC的输出:

prog.cc:13:14: error: explicit specialization in non-namespace scope 'struct Widget<T>'
     template<>
              ^

我正在使用GCC HEAD 8.0.1,-std=c++2a

1 个答案:

答案 0 :(得分:10)

这应该是一个GCC错误。应该允许在任何范围内完全专业化,包括在类定义中。

根据CWG 727,[temp.expl.spec]第2段已从

更改

(强调我的)

  

显式专门化应在包含专用模板的命名空间中声明。其声明者id或类头名未被限定的显式特化应在模板的最近的封闭命名空间中声明,或者,如果命名空间是内联的(10.3.1 [namespace.def]),则来自其的任何命名空间封闭命名空间集。这样的声明也可以是一个定义。如果声明不是定义,则可以稍后定义专门化(10.3.1.2 [namespace.memdef])。

(强调我的)

  

可以在任何范围中声明显式特化,其中可以定义相应的主模板(10.3.1.2 [namespace.memdef],12.2 [class.mem],17.6.2 [temp] .MEM])。

GCC似乎没有遵循这一点。

修改

我已将此问题报告为Bug 85282