为什么使用静态atomic变量编译提示'use of deleted function'错误?
错误原因
std::atomic类型的拷贝构造函数被显式删除,你使用的atomic<bool> TestClass::test3 = false;属于拷贝初始化语法:
- C++17之前,拷贝初始化要求先从右值
false构造一个临时std::atomic<bool>对象,再调用被删除的拷贝构造函数初始化静态成员,因此触发编译报错。 - 你代码中另外两个整型atomic成员没有触发报错属于编译器实现差异,按照C标准,所有atomic类型的拷贝初始化在C17之前都不符合语法要求。
另外注意你当前代码中所有atomic都缺少std::命名空间前缀,如果你没有在代码中添加using namespace std;或者using std::atomic;的声明,这也是潜在的编译错误点。
解决方案
有两种可行的修正方案:
- 方案一:改用直接初始化语法,完全避免拷贝构造的调用检查,兼容性最好,支持C++11及以上所有标准:
// 括号初始化写法 std::atomic<bool> TestClass::test3(false); // 或者列表初始化写法 std::atomic<bool> TestClass::test3{false};
- 方案二:如果你的编译环境支持C17及以上标准,可以在CMake配置中添加C17标准的声明,强制复制消除会直接跳过拷贝构造的调用,原有写法也可以正常编译:
# 在CMakeLists.txt中添加以下配置 set(CMAKE_CXX_STANDARD 17) set(CMAKE_CXX_STANDARD_REQUIRED ON)
内容的提问来源于stack exchange,提问作者crackanddie
相关产品推荐
相关产品推荐

