以下代码段在Clang 3.5中运行正常,但在GCC 4.9.2中却无法正常运行:
int main()
{
constexpr volatile int i = 5;
}
错误:
错误:此处不能同时使用“ volatile”和“ constexpr”
如果我检查Clang生成的程序集,它将5
按预期显示:
movl $5, -4(%rsp)
在GCC中,constexpr int i = 5
被优化掉了,但volatile int i = 5
也显示5
在装配中。volatile const int i = 5
在两个编译器中编译。同时具有可变性和const的东西不是外国的概念。
哪个编译器符合标准?
是的,这是有效的,存在缺陷报告1688:为此提交的易失constexpr变量说:
当前的措辞似乎没有语言说明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
节[expr.const] / 2包括所有,使一个条件表达式不是核心常量表达式包括以下情况:
左值到右值转换(4.1),除非将其应用于
并且所有例外要求:
[...]指的是非易失性对象[...]
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句