constexpr 可以和 volatile 结合使用吗?

2024-03-28

以下代码片段在 Clang 3.5 中工作正常,但在 GCC 4.9.2 中不行:

int main()
{
    constexpr volatile int i = 5;
}

有错误:

错误:此处不能使用“挥发性”和“constexpr”

如果我检查 Clang 生成的程序集,它会显示5正如预期:

movl    $5, -4(%rsp)

In GCC, constexpr int i = 5被优化掉了,但是volatile int i = 5还显示5在大会中。volatile const int i = 5在两个编译器中编译。同时具有易失性和常量性的东西并不是一个陌生的概念。

根据标准,哪个编译器是正确的?


是的,这是有效的,有缺陷报告 1688:易失性 constexpr 变量 http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2014/n4093.html#1688为此提交的文件称:

目前的措辞中似乎没有任何语言说明 constexpr 不能应用于 volatile 限定的变量 类型。此外,5.19 [expr.const] 第 2 段中的措辞提到 “用 constexpr 定义的非易失性对象”可能会导致人们推断 允许组合,但这样的变量不能 出现在常量表达式中。意图是什么?

它因不是缺陷而被拒绝(NAD),回应和理由是:

该组合是有意允许的,并且可以在某些情况下使用 强制常量初始化的情况。

正如 DR 指出的那样,这样的变量本身不能用于常量表达式:

constexpr volatile int i = 5;    
constexpr int y = i ;         // Not valid since i is volatile

Section [表达式.const]/2包括使条件表达式不是核心常量表达式的所有情况,包括:

左值到右值的转换(4.1),除非它应用于

所有例外都需要:

[...]指的是非易失性[...]对象[...]

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

constexpr 可以和 volatile 结合使用吗? 的相关文章

随机推荐