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)
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)