原子的类内初始化

for*_*818 4 c++ atomic in-class-initialization

为什么在这个例子中

struct Foo {
    atomic<int> x = 1;
};
Run Code Online (Sandbox Code Playgroud)

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

struct Bar {
    Bar() { x = 1; }
    atomic<int> x;
};
Run Code Online (Sandbox Code Playgroud)

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

PS:我已经知道了

struct Xoo {
    atomic<int> x{1};
};
Run Code Online (Sandbox Code Playgroud)

很好(无论如何是更好的初始化方式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;
       ^
Run Code Online (Sandbox Code Playgroud)

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

Lig*_*ica 10

std::atomic<int> x = 1;复制初始化,基本上是这样的:

std::atomic<int> x{std::atomic<int>{1}};
Run Code Online (Sandbox Code Playgroud)

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

(正如你所指出的,后来的operator=电话工作得很好.)

做正常的初始化:

std::atomic<int> x{1};
Run Code Online (Sandbox Code Playgroud)


Jar*_*d42 5

atomic<int> x = 1; // not an assignment.
Run Code Online (Sandbox Code Playgroud)

atomic<int> x{atomic<int>{1}};
Run Code Online (Sandbox Code Playgroud)

然而

atomic<int> x;
x = 1; // assignment
Run Code Online (Sandbox Code Playgroud)