我有一类像下面。
#include <atomic>
static const long myValue = 0;
class Sequence
{
public:
Sequence(long initial_value = myValue) : value_(initial_value) {}
private:
std::atomic<long> value_;
};
int main()
{
Sequence firstSequence;
Sequence secondSequence = firstSequence;
return 0;
}
我越来越喜欢这个编译错误,
test.cpp:21:36: error: use of deleted function ‘Sequence::Sequence(const Sequence&)’
test.cpp:5:7: error: ‘Sequence::Sequence(const Sequence&)’ is implicitly deleted because the default definition would be ill-formed:
test.cpp:5:7: error: use of deleted function ‘std::atomic<long int>::atomic(const std::atomic<long int>&)’
是默认的拷贝构造函数和赋值opertaor不要在这种情况下工作吗?
PS:我使用gcc版本4.6.3
您不能复制原子能与标准拷贝构造函数,因为所有的加载和存储必须明确地发生。 你必须写自己的拷贝构造函数Sequence
这确实形式的一些初始化value_(rhs.value_.load())
可能有更宽松的内存排序)。
原子已删除拷贝构造函数。 因此,在你的类复制/移动-构建函数将被删除。
n3337 12.8 / 11
隐式声明的复制/移动的构造是其类的内联公共成员。 一类X A拖欠复制/移动的构造被定义为删除(8.4.3)如果X具有:
-类类型M(或其阵列),其不能被复制/的非静态数据成员移动,因为重载解析(13.3),适用于M的对应的构造,导致歧义或从被删除的或不可访问的功能默认的构造函数,
因为没有std::atomic<long int>::atomic(const std::atomic<long int>&)
功能,也没有办法让编译器创建用于一个默认复制构造Sequence
类。 如果您需要该类的拷贝构造函数(如果你想你Sequence secondSequence = firstSequence;
工作),那么你需要写一个。
由标准要求的行为:
原子组成和地址类型如下所列。 这些类型的应有标准布局。 他们应该有一个平凡的默认构造函数,A constexpr明确的值构造, 删除的拷贝构造函数 ,一个缺失的拷贝赋值运算符和析构函数琐碎。 这些类型应支持集合初始化语法。
我猜想,选择要删除的是有两个原因的标准拷贝构造函数:
加载/存储对需要一般。 有没有办法强制执行,当你不控制的std ::原子的调用者就可以这样做?
如果标准::原子<>键入你使用你能做的就是一个针对is_lock_free()是假的(即互斥需要在该尺寸整数类型的实现)? 复制语义你用什么互斥初始化? 重新初始化的结束了隐式复制需要一个互斥体,因为它可以在锁定状态下偏偏复制。 我猜的std ::互斥体也有因为这个缺失的拷贝构造函数,并且推动需求为标准::原子了。
文章来源: Error with copy constructor/assignment operator for a class which has std::atomic member variable