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)
这里是哪个编译器?
GCC 拒绝给定代码是错误的。这可以从temp.expl.spec#3中看出,其中指出:
可以在可以定义相应主模板的任何范围内声明显式特化([dcl.meaning]、[class.mem]、[temp.mem])。
这意味着我们可以安全地为f类本身内部的成员函数模板提供显式特化。