简体   繁体   中英

Why memory_order_release support until C++20?

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

From cppreference, memory_order_release can use until C++20? Can anyone explain why C++ Standard will delete this and which one memory_order we should use after that.

This is just a misunderstanding with the formatting of cppreference. It's not that one line that is "until C++20", it's the whole block.

memory_order_release isn't removed in C++20. It's just that memory_order itself was respecified from being a weak enum:

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;

to an enum class (as a result of 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;

All six memory operations are still there, and are still accessible with the same spelling (although consume is discouraged).

You're misreading the table. It's saying that whole block applies to 11 <= C++ < 20.
The block below that defines all the same constants a different way applies to C++ >= 20.

It's just by chance of formatting that the (until C++20) is on the same line as memory_order_release . Note that (since C++11) is on the same line as acquire but clearly applies to all the constants because std::atomic was new in C++11.

The change is that there's now an enum class with short names for the constants:

enum class memory_order : /*unspecified*/ {
    relaxed, consume, acquire, release, acq_rel, seq_cst
};

And the full global-scope names are defined in terms of that, eg as

inline constexpr memory_order memory_order_release = memory_order::release;

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM