6

考虑代码:

#include <atomic>
#include <iostream>

struct stru {
  int a{};
  int b{};
};

int main() {
  std::atomic<stru> as;
  auto s = as.load();
  std::cout << s.a << ' ' << s.b << std::endl;
}

请注意,尽管stru具有默认成员初始值设定项,但自 C++14 起,它仍然可以作为聚合类型。std::atomic有一个简单的默认构造函数。根据标准,是否应该将 的成员as初始化为零?clang 6.0.0 没有这样做(参见此处),而 gcc 7.2.0 似乎如此(参见此处)。

4

2 回答 2

4

严格来说,我认为这两个编译器都是正确的,因为您的程序表现出未定义的行为。引用 n4140 (C++14), [atomics.types.operations.req],强调我的:

在以下操作定义中:

  • A 指的是原子类型之一。

[...]

A::A() noexcept = default;

效果:使原子对象处于未初始化状态。[注意:这些语义确保了与 C 的兼容性。- 尾注]

as在加载之前未初始化。因此,必须遵循关于未定义行为的通常说法。

于 2018-03-20T14:44:01.740 回答
0

根据cppreferencestd::atomic::atomic()构造函数不会初始化 obj:

atomic() noexcept = default;

1) 默认构造函数是微不足道的:除了静态和线程局部对象的零初始化之外,不进行任何初始化。std::atomic_init 可用于完成初始化。

于 2018-03-20T14:44:19.197 回答