首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >C++20前后的std::原子初始化

C++20前后的std::原子初始化
EN

Stack Overflow用户
提问于 2020-06-03 23:09:56
回答 3查看 432关注 0票数 2

考虑以下两行代码:

代码语言:javascript
复制
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>类型的初始化?

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2020-06-03 23:42:56

基于@chris注释,我认为以下代码将完成这项工作:

代码语言:javascript
复制
#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>头文件之一中定义。我当然不想写一些已经不推荐的东西(即允许使用,但出于某种原因而不鼓励使用)。

票数 1
EN

Stack Overflow用户

发布于 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了。

票数 5
EN

Stack Overflow用户

发布于 2020-06-03 23:34:48

如果您需要您的代码同时使用pre C++20和C++20,那么使用ATOMIC_FLAG_INIT。它在C++20中不受欢迎,因为不再需要它,但是仍然支持它,所以它将像以前一样在C++20中工作。

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/62184221

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档