双模板<>模板专业化

Double template<> in template specialization

本文关键字:专业化 gt lt      更新时间:2023-10-16

为什么下面的代码要编译?我不专门使用模板类的模板成员函数,因此只应使用一个template<>。但是,g++ 编译它没有任何警告,clang++ 只给出警告

警告:模板中存在无关的模板参数列表 专业化

template<typename T>
struct S{};
template<> template<> // why can we do this? 
struct S<int>{};
int main()
{
}

因为语法允许,并且模板专用化部分似乎没有任何禁止它的内容:

从 [克.温度]

显式专用化

template < >声明

来自 [克.dcl]

声明

[...]

显式专用化

2001 年以来,语法过于宽松的事实一直在活动问题列表 (#293) 中。

来自旧版本的clang的错误报告(作为PR5559提交)也讨论了这个问题。问题在于,gcc 和 clang 在显式专用化期间多个模板声明是否有效时都存在差异。Quoth Gabor Greif:

第一个错误实际上是没有的,clang正确地诊断出只需要一个"template <>"。但是因为 g++ 接受这一点,并且有几个人(像我一样)可能会误解"template <>"的数量是由嵌套而不是专用的级别数量控制的,因此将错误减少为警告并可能发出 fixit 提示可能会很有趣。

这种差异也可能是由标准对显式规范化的循环定义引起的(如@user657267所述)。