【发布时间】:2015-05-07 03:45:09
【问题描述】:
以下 sn-p 在 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 在两个编译器中编译。事物同时是 volatile 和 const 并不是一个陌生的概念。
按照标准,哪个编译器是正确的?
【问题讨论】:
-
constexpr和const不一样 -
@TheBuzzSaw:
volatile并不意味着任何事情都有改变的趋势。它只是意味着内存访问可能会产生副作用,因此编译器应将其视为 I/O。即使值保证保持不变,也很有必要在系统上使用volatile。 -
@user4637702 是的,但其他方式不正确。例如,尝试创建一个
constexpr std::string对象。 -
@TheBuzzSaw 如您所描述的那样使用布尔值是未定义的行为。
-
@TheBuzzSaw 例如,
const volatile可能适用于另一个进程同时修改的文件的只读内存映射,或硬件设备的只读内存映射寄存器。跨度>
标签: c++ c++11 gcc clang language-lawyer