我有一个类型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
被删除。
请参阅此文档页面。
由于您没有为定义显式的副本构造函数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] 删除。
我来说两句