双模板<>模板专业化
Double template<> in template specialization
为什么下面的代码要编译?我不专门使用模板类的模板成员函数,因此只应使用一个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所述)。
相关文章:
- 如何使用默认参数等选择模板专业化
- 模板化建造师专业化
- 类模板的成员功能的定义在单独的TU中完全专业化
- EASTL矢量<向量<int>>连续的
- 部分专业化和嵌套模板
- 模板专业化可以进入我的.cpp吗?
- 别名模板的专业化 C++11 中没有开销的最佳替代方案
- 部分专业化和对标准::void_t<>的需求
- "专业化不参与超载"
- 特定好友功能专业化
- 是否可以混合使用SFINAE和模板专业化?
- 为什么在班级专业化上会出现错误?
- enable_if如何帮助选择类模板的专业化?
- std::initializer_list可以专业化吗?
- 派生类中纯虚拟基方法的专业化
- "expected a '>'"类模板专业化?
- Clang不会编译GCC会编译的模板专业化
- 我可以用clang AST从模板专业化中获得默认的模板参数吗
- 函数模板部分专业化-有什么解决方法吗
- 明确的专业化“ CheckIntmap&lt;&gt;”实例化