为什么在 C++20 之前支持 memory_order_release?

qhs*_*ong 4 c++ memory-barriers c++20

https://en.cppreference.com/w/cpp/atomic/memory_order

从 cppreference 来看,memory_order_release 可以使用到 C++20 吗?任何人都可以解释为什么 C++ 标准会删除它以及之后我们应该使用哪个 memory_order。

Bar*_*rry 12

这只是对cppreference的格式的误解。不是“直到 C++20”的那一行,而是整个块。

memory_order_release在 C++20 中没有删除。只是它memory_order本身被重新指定为弱枚举:

typedef enum memory_order {
    memory_order_relaxed,
    memory_order_consume,
    memory_order_acquire,
    memory_order_release,
    memory_order_acq_rel,
    memory_order_seq_cst
} memory_order;
Run Code Online (Sandbox Code Playgroud)

到枚举类(由于P0439):

enum class memory_order : /*unspecified*/ {
    relaxed, consume, acquire, release, acq_rel, seq_cst
};
inline constexpr memory_order memory_order_relaxed = memory_order::relaxed;
inline constexpr memory_order memory_order_consume = memory_order::consume;
inline constexpr memory_order memory_order_acquire = memory_order::acquire;
inline constexpr memory_order memory_order_release = memory_order::release;
inline constexpr memory_order memory_order_acq_rel = memory_order::acq_rel;
inline constexpr memory_order memory_order_seq_cst = memory_order::seq_cst;
Run Code Online (Sandbox Code Playgroud)

所有六个内存操作仍然存在,并且仍然可以使用相同的拼写进行访问(尽管consume不鼓励)。