考虑以下两行代码:
std::atomic_flag a { }; // Since C++20
std::atomic_flag a = ATOMIC_FLAG_INIT; // Until C++20
在C++20中,第一行初始化a
到清晰的状态,但如果我在 C++17 中使用它,a
将被初始化为未指定的状态。第二行在 C++20 中已弃用,但在 C++ 17 中,它初始化a
到清晰状态。我怎样才能将它们都包含在代码中?我想我应该使用宏,但是那个宏到底是什么?它是否适用于所有其他的初始化std::atomic<T>
types?
atomic_flag
很特别。它在逻辑上等价于atomic<bool>
,但是委员会吸取了关于具有不同行为的独特专业化的教训,因此他们制作了一个完全独立的类型而不是专业化atomic
for bool
s.
All atomic<T>
s 可以通过给它一个 type 的值来初始化T
(这就是如何绕过 C++20 之前的值初始化废话)。atomic_flag
不能被给予bool
,因为它不存储bool
。这就是为什么它有那么特别ATOMIC_FLAG_INIT
macro.
ATOMIC_FLAG_INIT
可能已被弃用,但它在 C++20 中并未消失,因此您可以自由使用它。在里面相对不太可能发生的事件 http://www.open-std.org/JTC1/SC22/WG21/docs/papers/2020/p2139r0.html#3.24它已从 C++23 中删除,到那时您应该不再需要支持 C++17。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)