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

时间:2018-03-20 14:34:45

标签: c++ c++14 atomic default-constructor member-initialization

考虑代码:

#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不会这样做(见here),而gcc 7.2.0似乎是这样(见here)。

2 个答案:

答案 0 :(得分:3)

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

  

在以下操作定义中:

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

[...]

A::A() noexcept = default;
     

效果:将原子对象保留为未初始化状态。 [注意:这些语义确保与C的兼容性。 - 结束注释]

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

答案 1 :(得分:0)

根据cppreferencestd::atomic::atomic()构造函数没有初始化obj:

atomic() noexcept = default;
     

1)默认构造函数很简单:不进行初始化   除了静态和线程局部对象的零初始化。   std :: atomic_init可用于完成初始化。