以下代码片段在 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(使用前将#替换为@)