错误C2280:尝试引用已删除的函数(atomic <int>)

托本

我有一个类型class A为的成员变量_atomicVarstd::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
您能告诉我为什么会发生此错误吗?

马特乌斯·格热耶克(Mateusz Grzejek)

这是因为拷贝构造函数std::atomic删除

请参阅此文档页面

由于您没有为定义显式的副本构造函数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类型不可复制,您可能需要阅读此问题,尤其是可接受的答案。如果您要复制的值std::atomic,则可以执行以下操作:

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

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

另外,您可能还想定义显式赋值运算符(请记住“三规则”)。

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

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;
};

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

编译器错误C2280,尝试引用已删除的函数运算符=

错误C2280:'QQmlPrivate :: QQmlElement <T> :: QQmlElement(void)':尝试引用已删除的函数

错误C2280:尝试引用已删除的函数(unique_ptr)

C++ 错误 (C2280) 尝试访问已删除的函数

如何修复错误'std :: promise <int> :: promise(const std :: promise <int>&)':尝试引用已删除的函数

多级继承错误 C2280:“试图引用已删除的函数”

错误 C2280:Class::Class(void):试图引用已删除的函数

std :: atomic_int出现“使用已删除函数”错误

Visual Studio 2013和2015中的C ++编译器错误C2280“试图引用已删除的函数”

C ++错误C2280-尝试引用已删除的函数-在原始类型上

C2280:复制构造函数的“尝试引用引用的已删除函数”,CC248“'operator ='无法访问在类中声明的私有成员”(Cocos2dx)

unique_ptr,qvector.resize()引发错误2280,尝试引用已删除的函数

使用Future时获取C2280(试图引用已删除的功能)

对已删除其副本构造函数的对象的向量进行迭代(C2280)

与所有其他编译器一起使用的MSVC错误C2280(试图引用已删除的功能)

引用 std::atomic<bool> 的已删除函数错误

删除对解引用的int的引用

从向量c ++中删除对象,尝试引用已删除的函数

尝试将对象添加到向量时出现错误C2280

为什么传递带有const引用成员的结构会导致C2280错误?

C ++复制构造函数:尝试引用已删除的函数

C++ 为什么在不使用被删除的函数时编译器失败,错误代码为 C2280

C ++线程和承诺:尝试引用已删除的函数

新手:尝试比较对静态整数的引用时出现“类型不匹配 *int 和 int”错误

C ++ map <int,vector <int>>分割错误

C#-引用“ this int”参数

尝试引用已删除的函数 _ gmock

我不断收到错误 C2440 '=': cannot convert from 'int *(__cdecl *)(int *,int *,int,int)' to 'int *

从引用的int列表创建int列表