原子的类内初始化

in-class initialization of atomic

本文关键字:初始化 原子的      更新时间:2023-10-16

为什么在这个例子中

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};
};

很好(无论如何,初始化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&)是完全错误的。

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

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

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

(正如您所指出的,稍后的operator=调用工作正常。

执行正常初始化:

std::atomic<int> x{1};
atomic<int> x = 1; // not an assignment.

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

atomic<int> x;
x = 1; // assignment