为什么在GCC和 Clang上把std::atomic_flag初始化为false会工作,但在Visual Studio上却不行?

编程语言 2026-07-11

以下是代码:

#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导航站,无授权禁止任何主体转载、抄袭、复制内容,亦不得私自架设镜像站点。一经侵权,本站将通过法律途径追责。

相关文章