具有std :: atomic成员变量的类的复制构造函数/赋值运算符出错

pol*_*pts 22 c++ multithreading atomic c++11

我有一个类似下面的课程.

#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;
}
Run Code Online (Sandbox Code Playgroud)

我收到这样的编译错误,

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>&)’
Run Code Online (Sandbox Code Playgroud)

这是默认的复制构造函数,赋值opertaor在这种情况下不起作用吗?

PS:我使用的是gcc 4.6.3版

Ker*_* SB 22

您不能使用标准复制构造函数复制原子,因为所有加载和存储必须显式发生.你必须编写自己的复制构造Sequence函数,为表格做一些初始化value_(rhs.value_.load())(可能有更宽松的内存排序).


For*_*veR 7

Atomic删除了copy-ctor.因此,您班级中的复制/移动控制器将被删除.

n3337 12.8/11

隐式声明的复制/移动构造函数是其类的内联公共成员.如果X具有以下内容,则将类X的默认复制/移动构造函数定义为已删除(8.4.3):

- 类型M(或其数组)的非静态数据成员,由于应用于M的相应构造函数的重载解析(13.3),无法复制/移动,导致模糊或被删除或无法访问的函数默认构造函数,


Dav*_*rtz 6

由于没有std::atomic<long int>::atomic(const std::atomic<long int>&)函数,编译器无法为Sequence该类创建默认的复制构造函数.如果您需要该类的复制构造函数(如果您想要Sequence secondSequence = firstSequence;工作则需要),那么您需要编写一个.

标准需要此行为:

原子积分和地址类型如下所示.这些类型应具有标准布局.它们应该有一个简单的默认构造函数,一个constexpr显式值构造函数,一个删除的复制构造函数,一个删除的复制赋值运算符和一个普通的析构函数.这些类型应支持聚合初始化语法.


Pee*_*oot 5

我猜想选择删除标准中的复制构造函数有两个原因:

  • 通常需要加载/存储对。当您不控制 std::atomic 的调用者时,有什么方法可以强制执行此操作吗?

  • 如果您使用的 std::atomic<> 类型是 is_lock_free() 为 false 的类型(即,在该大小的整数类型的实现中需要互斥体),您该怎么办?您使用什么复制语义来初始化互斥体?最终隐式复制的互斥锁需要重新初始化,因为它可能会在锁定状态下不幸被复制。我猜想 std::mutex 也有一个删除的复制构造函数,因此,这也将需求推入了 std::atomic 中。