[英]C++20 std::atomic<float>- std::atomic<double>.specializations
[英]Initialization of std::atomic before and after C++20
考慮以下兩行代碼:
std::atomic_flag a { }; // Since C++20
std::atomic_flag a = ATOMIC_FLAG_INIT; // Until C++20
在 C++20 中,第一行將a
初始化為明確的 state,但如果我在 C++17 中使用它, a
將被初始化為未指定的 state。 第二行在 C++20 中已棄用,但在 C++ 17 中,它將a
初始化為明確的 state。 我怎樣才能將它們都包含在代碼中? 我想我應該使用宏,但那個宏到底是什么? 它是否適用於所有其他std::atomic<T>
類型的初始化?
如果您需要您的代碼同時使用 C++20 和 C++20 之前的版本,請使用ATOMIC_FLAG_INIT
。 它在 C++20 中已棄用,因為不再需要它,但它仍然受支持,因此它可以像以前一樣在 C++20 中工作。
atomic_flag
是特殊的。 它在邏輯上等同於atomic<bool>
,但委員會吸取了他們關於具有不同行為的獨特特化的教訓,因此他們為bool
制作了一個完全獨立的類型而不是atomic
的特化。
所有atomic<T>
都可以通過給它一個T
類型的值來初始化(這樣你就可以繞過 C++20 之前的值初始化廢話)。 atomic_flag
不能被賦予bool
,因為它不存儲bool
。 這就是為什么它有那個特殊ATOMIC_FLAG_INIT
宏。
ATOMIC_FLAG_INIT
可能已被棄用,但在 C++20 中並沒有消失,因此您可以自由使用它。 在相對不太可能的情況下,它被 C++23 刪除,到那時你應該希望不再需要支持 C++17。
根據@chris 評論,我認為以下代碼可以完成這項工作:
#if __has_cpp_attribute(__cpp_lib_atomic_value_initialization)
std::atomic_flag a { };
#else
std::atomic_flag a = ATOMIC_FLAG_INIT;
#endif
所需的宏在<memory>
、 <atomic>
和<version>
header 文件之一中定義。 我當然不想寫已經被棄用的東西(即允許使用,但由於某種原因不鼓勵使用)。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.