说我有一些对象声明为const volatile
:
根据C ++标准($ 7.1.5.1 / 8):
[..] volatile是一个提示,以避免攻击性 涉及对象的优化因为对象的值 可能会被实施无法检测到。[...]
但是,const
限定符暗示对象 不 可能会发生变化,因此两个限定符似乎发生冲突:
一个意味着对象应该被区别对待,因为它可能会发生变化,而另一个暗示它应该被区别对待,因为不可能会发生变化。
那么,为什么允许变量首先是const volatile
?
答案 0 :(得分:3)
如果你定义
const some_type x = some_value;
这意味着您无法修改x
的值。如果没有volatile
,编译器可以将x
的引用替换为some_value
。
如果你定义
const volatile some_type x = some_value;
然后你仍然无法修改x
(至少不能使用名称x
),但编译器不能再认为它的值不能改变。对x
的值的任何引用都必须实际从内存中加载其值;它不能假设它将始终保持其初始值。
例如,可能存在一些特定于编译器的属性,它将x
与某个设备相关联。名称x
提供对象的只读视图; volatile
禁止某些优化。
答案 1 :(得分:1)
这没有多大意义:
int const volatile x = 42;
你是对的,x
无法更改 - 请删除volatile
。但是,以下是不同的:
int x = 42;
int const volatile& y = x;
现在y
无法更改,但x
可以,并且其更改会传播到y
。当然,无论volatile
如何,这都有效 - 但如果对y
的更改来自对C ++编译器无法观察的源,则volatile
可能变得必要。当然,在volatile
有意义的情况下,指针/引用不仅会引用任何其他变量,而是引用映射到硬件或其他地方的特定内存地址。