GCC 与非命名空间范围内的显式专业化标准不一致
C 标准明确允许在任何范围内声明显式模板专业化可以在其中定义相应的主模板。然而,GCC 的行为却偏离了这个标准。在最新版本的 GCC 中已经观察到了这种差异,在命名空间之外声明的显式专业化无法编译。
为了说明该问题,请考虑以下代码:
template<typename T> struct Widget { template<typename U> void foo(U) { } template<> void foo(int*) { } };
虽然此代码在Clang中编译成功,在GCC中却遇到错误:
error: explicit specialization in non-namespace scope 'struct Widget<T>'
这个错误与C标准不一致,明确允许在非命名空间范围内显式专业化。根据 C 标准中的 [temp.expl.spec] 第 2 段:
“可以在定义相应主模板的任何范围内声明显式特化。”
这种与标准的偏差构成了 GCC 中的潜在错误。要报告此问题,请按照以下步骤操作:
通过报告此问题,您可以为 GCC 的改进做出贡献,并确保它完全遵循 C 标准。
以上是为什么 GCC 拒绝命名空间之外的显式专业化?的详细内容。更多信息请关注PHP中文网其他相关文章!