6

为什么在这个例子中

struct Foo {
    atomic<int> x = 1;
};

编译器(gcc 4.8)正在尝试使用atomic& operator=(const atomic&)已删除的,(因此示例不会编译),而在这里

struct Bar {
    Bar() { x = 1; }
    atomic<int> x;
};

int operator=(int)按预期调用?

PS:我已经知道了

struct Xoo {
    atomic<int> x{1};
};

很好(无论如何是更好的 init 方法x),但我仍然很好奇为什么Foo会坏。

PS:我误读了编译器错误(并忘记将其包含在问题中)。它实际上说:

 error: use of deleted function ‘std::atomic<int>::atomic(const std::atomic<int>&)’
   std::atomic<int> x = 1;
                        ^
 [...] error: declared here
       atomic(const atomic&) = delete;
       ^

所以我上面的陈述“......试图使用atomic& operator=(const atomic&)完全错误。

4

2 回答 2

12

std::atomic<int> x = 1;copy-initialisation,基本上是这样做的:

std::atomic<int> x{std::atomic<int>{1}};

您的编译器实际上并没有抱怨operator=,而是抱怨复制构造函数。

(正如您所指出的,稍后operator=调用就可以了。)

做一个正常的初始化:

std::atomic<int> x{1};
于 2017-05-12T13:49:22.510 回答
4
atomic<int> x = 1; // not an assignment.

atomic<int> x{atomic<int>{1}};

然而

atomic<int> x;
x = 1; // assignment
于 2017-05-12T13:50:34.460 回答