为什么在 C++20 中弃用了 volatile?

Why is volatile deprecated in C++20?

根据 cppreference,大多数 volatile 关键字的使用将在 C++20 中弃用。 volatile的缺点是什么?不使用 volatile 时的替代解决方案是什么?

C++ committee language evolution chair 就原因进行了很好的讨论。

简要总结,volatile 被删除的地方在标准中没有任何明确定义的含义,只是造成了混淆。


激励(模棱两可)的例子

  • 易失性位字段应由您的硬件手册and/or编译器指定。
  • +=是single/atomic指令吗? ++怎么样?
  • compare_exchange 需要多少 reads/writes?如果失败了怎么办?
  • void foo(int volatile n)是什么意思?或 int volatile foo()?
  • 应该*vp;加载吗? (这在标准中已更改两次。)

线程

历史上,人们使用 volatile 在 C 和 C++ 中实现线程安全。在 C++11 中,添加了在线程之间创建同步和共享状态的非 UB 方法。我推荐 Back to Basics: Concurrency 作为一个很好的介绍。