为什么在GCC和 Clang上把std::atomic_flag初始化为false会工作,但在Visual Studio上却不行?
以下是代码:
#include <atomic>
std::atomic_flag bShouldStop = false;
int main() {
}
在GCC与 Clang上可以编译,但在Visual Studio上不行,给出错误:
(6): 错误C2440: 'initializing': 无法将 'bool' 转换为 'std::atomic_flag'
(6): 注:'std::atomic_flag::atomic_flag':没有可重载的函数能够将所有参数类型转换
前往Godbolt的链接。
解决方案
std::atomic_flag 是一件相当奇怪的东西,主要是从C 语言复制来的。它不能以任何方式进行初始化,除了一个特殊的宏 ATOMIC_FLAG_INIT,它会把对象初始化为 false 状态。
ATOMIC_FLAG_INIT 具有实现相关性,GCC将它定义为 {0},而MSVC将其定义为 {}。这意味着GCC决定添加一个接收 int 的构造函数(或可转换为 int 的某种形式),并且使用 bool 也能工作。MSVC没有添加这样的构造函数,因此你不能使用 bool 来初始化它。请参阅Godbolt上两种编译器的 预处理输出。
在C++20中,默认构造函数终于做了明智的事情,把对象初始化为 false 状态,而不是让它保持未定义。在C++20之前,唯一可移植的方式是使用 ATOMIC_FLAG_INIT。
站内所有文章版权归属LeftHeroAI导航站,无授权禁止任何主体转载、抄袭、复制内容,亦不得私自架设镜像站点。一经侵权,本站将通过法律途径追责。