in-class 原子的初始化
in-class initialization of atomic
为什么在这个例子中
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;
是 copy-initialisation,基本上是这样做的:
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
为什么在这个例子中
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;
是 copy-initialisation,基本上是这样做的:
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