考虑以下两行代码:
std::atomic_flag a { }; // Since C++20
std::atomic_flag a = ATOMIC_FLAG_INIT; // Until C++20在C++20中,第一行将a初始化为clear状态,但如果在C++17中使用它,则a将初始化为未指定的状态。第二行在C++20中不被推荐,但在C++ 17中,它将a初始化为清除状态。我怎么能把它们都写在密码里呢?我想我应该使用宏,但是那个宏到底是什么?它是否适用于所有其他std::atomic<T>类型的初始化?
发布于 2020-06-03 23:42:56
基于@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>头文件之一中定义。我当然不想写一些已经不推荐的东西(即允许使用,但出于某种原因而不鼓励使用)。
发布于 2020-06-03 23:43:23
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++23中,到那时您应该不必再支持C++17了。
发布于 2020-06-03 23:34:48
如果您需要您的代码同时使用pre C++20和C++20,那么使用ATOMIC_FLAG_INIT。它在C++20中不受欢迎,因为不再需要它,但是仍然支持它,所以它将像以前一样在C++20中工作。
https://stackoverflow.com/questions/62184221
复制相似问题