应该是普通的默认构造函数尊重默认成员初始化程序吗?

Lin*_*gxi 5 c++ atomic default-constructor member-initialization c++14

考虑一下代码:

#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;
}
Run Code Online (Sandbox Code Playgroud)

请注意,尽管stru具有默认成员初始值设定项,但它仍然符合自C++ 14以来的聚合类型.std::atomic有一个普通的默认构造函数.根据标准,成员as应该初始化为零吗?clang 6.0.0不会这样做(见这里),而gcc 7.2.0似乎是这样(见这里).

Sto*_*ica 4

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

\n\n
\n

在以下操作定义中:

\n\n
    \n
  • A 指原子类型之一。
  • \n
\n\n

[...]

\n\n
A::A() noexcept = default;\n
Run Code Online (Sandbox Code Playgroud)\n\n

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

\n
\n\n

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

\n

  • @Lingxi - 否。该构造函数被定义为默认值,具有不进行初始化的指定效果。值初始化它会调用相同的c'tor。 (2认同)