C++ 为什么存在 "const volatile" 类型限定符?

C++ Why does the "const volatile" type qualifier exist?

假设我有一些对象声明为 const volatile:

根据 C++ 标准 ($7.1.5.1/8):

[..] volatile is a hint to the implementation to avoid aggressive optimization involving the object because the value of the object might be changed by means undetectable by an implementation.[...]

然而,const限定词暗示对象是而不是,因此这两个限定词似乎冲突:

一个暗示应该区别对待对象,因为它可能会发生变化,另一个暗示应该区别对待它,因为它不会发生变化。

那么,为什么首先允许变量是 const volatile

这没有多大意义:

int const volatile x = 42;

你说得对,x 无法更改 — 删除 volatile。但是,以下是不同的:

int x = 42;
int const volatile& y = x;

现在无法更改 y,但 x 可以,并且其更改会传播到 y。当然,这与 volatile 无关 — 但如果对 y 的更改来自 C++ 编译器无法观察到的来源,则可能需要 volatile。当然,在 volatile 有意义的情况下,pointer/reference 不仅仅指任何其他变量,而是指映射到硬件或其他地方的特定内存地址。

如果你定义

const some_type x = some_value;

也就是说你不能修改x的值。在没有 volatile 的情况下,编译器可以用 some_value.

替换对 x 的引用

如果你定义

const volatile some_type x = some_value;

那么你仍然不能修改x(至少不能通过使用名称x),但是编译器不能再假设它的值不能改变。对 x 值的任何引用都必须实际从内存中加载它的值;它不能假设它将始终保留其初始值。

例如,可能有一些特定于编译器的属性将 x 与某些设备相关联。名称 x 提供对象的只读视图; volatile 禁止某些优化。