C++中能否用volatile constexpr变量初始化另一个同类型变量?
constexpr volatile变量的编译器行为合规性分析
根据2013年9月解决的缺陷报告1688,C标准允许使用constexpr volatile变量组合,该特性是有意被许可的,可在部分场景下强制常量初始化,其设计初衷可能是为C20引入的constinit volatile特性做铺垫。不过目前不同编译器对constexpr volatile的处理存在明显差异。
示例代码
int main() { constexpr volatile int i = 0; constexpr volatile int j = i; return j; }
编译器表现差异
- GCC与MSVC可正常编译上述代码
- Clang会触发编译错误:
error: constexpr variable 'j' must be initialized by a constant expression constexpr volatile int j = i; ^ ~ note: read of volatile-qualified type 'const volatile int' is not allowed in a constant expression constexpr volatile int j = i;
合规性判定与原因
Clang的处理严格符合C++标准,理由如下:
- DR1688仅允许声明
constexpr volatile变量,但并未放宽常量表达式的约束规则。 - C++标准明确规定:常量表达式中禁止对volatile限定类型执行读取操作。示例中初始化
constexpr变量j时,读取了volatile变量i,该操作不属于常量表达式的合法范畴。 - GCC和MSVC的编译通过属于编译器扩展行为,并未严格遵循标准的常量表达式规则。
内容的提问来源于stack exchange,提问作者Fedor
相关产品推荐
相关产品推荐

