【发布时间】:2022-11-21 06:49:26
【问题描述】:
C++ 标准允许每个 defect report 1688 的 constexpr volatile 变量,该问题已于 2013 年 9 月解决:
这种组合是有意允许的,并且可以在某些情况下用于强制常量初始化。
看起来其意图是仅允许
constinit volatile,这在 C++20 之前是不可用的。在某些情况下,当前的编译器在处理
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;在线演示:https://gcc.godbolt.org/z/43ee65Peq
哪个编译器就在这里,为什么?
【问题讨论】:
标签: c++ language-lawyer constexpr volatile