GCC 与 Clang 中的显式成员函数模板专业化错误

use*_*570 4 c++ language-lawyer class-template

当我注意到一种这样的情况(如下所示)在 clang 和 msvc 中编译良好但在 gcc 中编译失败时,我试图显式地专门化一个成员函数模板。这是验证相同内容的链接:https ://godbolt.org/z/15z4nT5Kx

struct C 
{
    template<typename T> 
    void f()
    {
        
    }
    
    template<> void f<int>()
    {
        
    }
};

int main()
{   
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

从上面的链接中可以看出,clang 和 msvc 编译程序没有任何问题,但 gcc 说:

<source>:10:14: error: explicit specialization in non-namespace scope 'struct C'
   10 |     template<> void f<int>()
      |              ^
<source>:10:21: error: template-id 'f<int>' in declaration of primary template
   10 |     template<> void f<int>()
      |                     ^~~~~~
Run Code Online (Sandbox Code Playgroud)

这里是哪个编译器?

use*_*570 5

GCC 拒绝给定代码是错误的。这可以从temp.expl.spec#3中看出,其中指出:

可以在可以定义相应主模板的任何范围内声明显式特化([dcl.meaning]、[class.mem]、[temp.mem])。

这意味着我们可以安全地为f类本身内部的成员函数模板提供显式特化。

这里是相关的 gcc bug 报告CWG 问题