error: use of deleted function ‘std::atomic<bool>::atomic(const std::atomic<bool>&)’ std::atomic<bool> m_BConnectStutas = false; 为什么报错
时间: 2023-11-09 19:46:27 浏览: 619
这个错误是由于 `std::atomic<bool>` 类型的拷贝构造函数被删除(deleted)导致的。`std::atomic` 类型是为了实现原子操作而设计的,它们通常不支持拷贝和赋值操作,以确保线程安全。相反,你应该使用 `std::atomic<bool>` 的默认构造函数来初始化它。
这样写会解决问题:
```cpp
std::atomic<bool> m_BConnectStatus(false);
```
或者在 C++11 之前的标准中,你可以使用普通的 `bool` 类型变量,并使用 mutex 或其他同步机制来保护它的访问。
如果你需要对 `std::atomic<bool>` 进行拷贝或赋值操作,你可以考虑使用 `std::atomic_ref` 类型,它在 C++20 中引入。这样做可以避免拷贝构造函数被删除的问题。
相关问题
error: use of deleted function ‘std::atomic<bool>::atomic(const std::atomic<bool>&)’ Result(Result&&) = default;
这个错误信息表明在代码中使用了一个被删除的函数std::atomic<bool>::atomic(const std::atomic<bool>&)。这个函数被删除的原因是因为std::atomic是一个原子类型,它的拷贝构造函数是被禁止的,因为原子类型必须是独占所有权的。因此,不能使用拷贝构造函数来创建一个新的std::atomic对象。
如果你想要创建一个新的std::atomic对象,可以使用默认的构造函数或者移动构造函数。如果需要将一个std::atomic对象复制到另一个std::atomic对象,可以使用赋值运算符。
ecg_wave_sub_widgets/ccolorchoicewidget.cpp:289:62: error: use of deleted function ‘std::atomic<bool>::atomic(const std::atomic<bool>&)’ std::atomic<bool> CColorChoiceWidget::m_abortInitialzation = false; 这是什么问题?
### 关于 `std::atomic<bool>` 的编译错误解决方案
在 C++ 中,`std::atomic<T>` 是一个模板类,用于实现线程安全的原子操作。然而,`std::atomic<T>` 的拷贝构造函数和赋值操作符被显式删除(deleted),以防止对象之间的浅拷贝或深拷贝[^1]。这导致了在使用 `std::atomic<bool>` 时,如果尝试通过拷贝构造函数初始化对象,会遇到编译错误。
#### 错误原因
以下代码片段展示了可能导致编译错误的情况:
```cpp
std::atomic<bool> shutdown = false; // 错误:调用了被删除的拷贝构造函数
```
上述代码试图通过 `false` 初始化 `shutdown`,但实际上它等价于创建一个临时的 `std::atomic<bool>` 对象,并将其赋值给 `shutdown`。由于拷贝构造函数被删除,这会导致编译失败[^2]。
#### 正确的初始化方式
为了避免此问题,应直接使用括号语法进行初始化:
```cpp
std::atomic<bool> shutdown(false); // 正确:直接调用构造函数
```
这种方式不会涉及拷贝构造函数,而是直接调用 `std::atomic<bool>` 的构造函数来初始化对象。
#### 示例代码
以下是一个完整的示例,展示如何正确使用 `std::atomic<bool>`:
```cpp
#include <atomic>
#include <iostream>
#include <thread>
std::atomic<bool> shutdown(false);
void worker() {
while (!shutdown.load()) { // 使用 load 方法读取值
std::cout << "Worker is running...\n";
std::this_thread::sleep_for(std::chrono::seconds(1));
}
std::cout << "Worker has stopped.\n";
}
int main() {
std::thread t(worker);
std::this_thread::sleep_for(std::chrono::seconds(5));
shutdown.store(true); // 使用 store 方法写入值
if (t.joinable()) {
t.join();
}
return 0;
}
```
#### 注意事项
- 在访问 `std::atomic<bool>` 的值时,推荐使用 `.load()` 和 `.store()` 方法,而不是直接使用 `operator=` 或 `operator bool`,以确保操作的明确性和可读性[^1]。
- 如果需要将 `std::atomic<bool>` 作为类成员变量,确保在构造函数的初始化列表中正确初始化它,例如:
```cpp
class MyClass {
public:
MyClass() : shutdown(false) {} // 正确:在初始化列表中初始化
private:
std::atomic<bool> shutdown;
};
```
###
阅读全文
相关推荐













