首页 > 解决方案 > 未使用的常量变量模板的默认初始化

问题描述

以下程序

template<typename = void> 
const int n;

被gcc编译成功,但是clang报错:

# error: default initialization of an object of const type 'const int'
const int n;
          ^
            = 0

这是有道理的。

如果使用gcc 确实会给出错误n,但即使n未使用也需要诊断吗?

标签: c++language-lawyeruninitialized-constant

解决方案


即使n未使用,是否也需要诊断?

不,适用的规则是[temp.res.general]/8

可以在任何实例化之前检查模板的有效性。

该程序格式错误,不需要诊断,如果:

  • 无法为模板或 constexpr 的子语句生成有效的特化,如果模板内的语句和模板未实例化,或
  • ...
  • 由于不依赖于模板参数的构造,紧随其定义的模板的假设实例化将是格式错误的,或者
  • ...

所以两个编译器都符合标准。


推荐阅读