在 C++20 中增加 易失性,不推荐对易失性进行操作

Ami*_*rsh 5 c++ volatile deprecated c++20

C++20 弃用了类型上的某些特定操作volatile(遵循P1152)。

以下代码在 C++20 之前有效:

void busyLoop(std::size_t count) {
  for (volatile size_t counter = 0; counter < count; ++counter);
}
Run Code Online (Sandbox Code Playgroud)

现在生成弃用警告:

warning: '++' expression of 'volatile'-qualified type is deprecated [-Wvolatile]
Run Code Online (Sandbox Code Playgroud)

更改++to+=或 tocounter = counter + 1没有帮助,因为问题似乎在于基于易失性类型计算新值。

上面的代码如何调整以适应新的C++20规则?

Nic*_*las 5

弃用这些操作的目的是为了明确volatile变量在任何方面都不是原子的,并且不应期望以原子方式进行操作。因此,对于使用 的任何实际代码volatile,您需要将值读入本地,操作该本地副本,然后将该值写回该volatile值。

这种访问模式旨在模仿委员会希望编入基于功能的界面的内容,该界面将(也许?)volatile在某个时候完全取代。也就是说,volatile成为在加载和存储时访问内存地址的一种方式;它不会是一个对象的内在属性。


请注意,C++23将“弃用”volatile对象上的某些复合操作。但是,此更改仅适用于按位运算符。其他复合操作仍然被弃用,但尚未删除。


Ami*_*rsh 2

虽然volatile在 C++20 中不推荐增加问题中所见的 ,但您可以增加非易失性类型并将结果分配回该volatile类型。

以下代码在 C++20 中有效:

void busyLoop(size_t count) {
  size_t i = 0;
  for ([[maybe_unused]]volatile size_t counter = 0; i < count; counter = i, ++i);
}
Run Code Online (Sandbox Code Playgroud)