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

Koo*_*sha 2 c++ atomic c++17 c++20

考虑以下两行代码:

std::atomic_flag a { };                // Since C++20
std::atomic_flag a = ATOMIC_FLAG_INIT; // Until C++20
Run Code Online (Sandbox Code Playgroud)

在 C++20 中,第一行初始化a为清除状态,但如果我在 C++17 中使用它,a将初始化为未指定的状态。第二行在 C++20 中已弃用,但在 C++ 17 中,它初始化a为清除状态。我怎样才能将它们都包含在代码中?我想我应该使用宏,但是那个宏到底是什么?它适用于所有其他类型的初始化吗std::atomic<T>

Nic*_*las 5

atomic_flag很特别。它在逻辑上相当于 an atomic<bool>,但委员会吸取了具有不同行为的独特专业化的教训,因此他们创建了一个完全独立的类型,而不是atomicfor bools 的专业化。

所有atomic<T>s 都可以通过给它一个 type 值来初始化T(这样你就可以绕过 C++20 之前的值初始化废话)。atomic_flag不能给出 a bool,因为它不存储 a bool。这就是为什么它有那个特殊的ATOMIC_FLAG_INIT宏。

ATOMIC_FLAG_INIT可能已被弃用,但它在 C++20 中并未消失,因此您可以自由使用它。在相对不太可能发生的情况下,它会在 C++23 中被删除,届时您应该不再需要支持 C++17。