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规则?
弃用这些操作的目的是为了明确volatile
变量在任何方面都不是原子的,并且不应期望以原子方式进行操作。因此,对于使用 的任何实际代码volatile
,您需要将值读入本地,操作该本地副本,然后将该值写回该volatile
值。
这种访问模式旨在模仿委员会希望编入基于功能的界面的内容,该界面将(也许?)volatile
在某个时候完全取代。也就是说,volatile
成为在加载和存储时访问内存地址的一种方式;它不会是一个对象的内在属性。
请注意,C++23将“弃用”volatile
对象上的某些复合操作。但是,此更改仅适用于按位运算符。其他复合操作仍然被弃用,但尚未删除。
虽然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)
归档时间: |
|
查看次数: |
1963 次 |
最近记录: |