簡體   English   中英

C++20前后std::atomic的初始化

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM