gpt4 book ai didi

c++ - 错误 C2280 : attempting to reference a deleted function (atomic)

转载 作者:塔克拉玛干 更新时间:2023-11-02 23:09:35 24 4
gpt4 key购买 nike

我有一个 class A带有成员变量 _atomicVar类型 std::atomic<int> .

#include <atomic>

class A
{
public:
A();
~A();

private:
std::atomic<int> _atomicVar;
};

如果我构建项目,我会收到以下错误:

error C2280: 'std::atomic<int>::atomic(const std::atomic<int> &)' : attempting to reference a deleted function

我主要是一名 C# 开发人员,所以我还不了解 C++ 的每个细节(还)。我不知道我在哪里使用 atomic<int> 的复制代码.
我还尝试初始化 _atomicVar :

std::atomic<int> _atomicVar { 0 };

...但这没有用。
我希望 _atomicVar (没有显式初始化)将使用 int 的默认值进行初始化.
你能告诉我为什么会出现这个错误吗?

最佳答案

那是因为 std::atomic 的复制构造函数被删除

参见 this documentation page .

由于您没有为 A 定义显式复制构造函数,编译器会生成默认复制构造函数,它只是为所有成员调用复制构造函数(这对于 std::atomic).

解决方法:

class A
{
public:
A();
A(const A& origin); // add this line
~A();
private:
std::atomic<int> _atomicVar;
};

A::A(const A& origin)
: _atomicVar(0) //zero-initialize _atomicVar
{
}

编辑

如果您想知道为什么 atomic 类型不可复制,您可能需要阅读 this question ,特别是接受的答案。如果你想复制 std::atomic 的值,你可以这样做:

A::A(const A& origin)
: _atomicVar(origin._atomicVar.load())
{
}

但请记住,此操作本身不会是原子操作(并且对于大多数逻辑而言,它是无意义的)。

此外,您可能还想定义显式赋值运算符(记住 Rule of Three )。

让程序正常运行的最佳选择是删除这两个方法:

class A
{
public:
A();
A(const A&) = delete;
~A();

A& operator=(const A&) = delete;

private:
std::atomic<int> _atomicVar;
};

如果您的编译器不支持此功能(例如 VC12 之前的任何 VC),请将它们声明为私有(private)且不提供主体:

class A
{
public:
A();
~A();

private:
//do not define these two
A(const A&);
A& operator=(const A&);

private:
std::atomic<int> _atomicVar;
};

关于c++ - 错误 C2280 : attempting to reference a deleted function (atomic<int>),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29332897/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com