为什么 std::atomic_flag 用 false 初始化在 Visual Studio 中失败?
数据阿明
结论
std::atomic_flag 不能以 false 可移植地初始化。GCC 和 Clang 接受这段代码,可能与编译器、标准库实现或语言标准模式有关。仅凭代码和报错无法确定具体原因。应根据项目使用的 C++ 标准版本,选择受该标准支持的初始化方式。
问题出在这行代码:
std::atomic_flag bShouldStop = false;
Visual Studio 报告无法将 bool 转换为 std::atomic_flag,这与初始化表达式的类型不匹配。
按 C++ 标准版本初始化
C++11 至 C++17 使用 ATOMIC_FLAG_INIT:
#include <atomic>
std::atomic_flag bShouldStop = ATOMIC_FLAG_INIT;
int main() {
}
C++20 及之后可以使用默认初始化。默认构造的 std::atomic_flag 处于清除状态:
#include <atomic>
std::atomic_flag bShouldStop{};
int main() {
}
检查编译设置
确认 GCC、Clang 和 Visual Studio 使用相同的 C++ 标准版本。GCC 和 Clang 可检查 -std= 参数;Visual Studio 可检查项目的 C++ 语言标准设置(/std:)。项目若需兼容 C++11 至 C++17,应使用 ATOMIC_FLAG_INIT;若明确使用 C++20 或更新标准,可以使用 {}。
某个编译器接受 = false,不代表这段代码在其他编译器、标准库或语言模式下也能编译。
备注:内容仅供参考。
