考虑代码:
#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)。
答案 0 :(得分:3)
严格地说,我认为两个编译器都是正确的,因为你的程序表现出不确定的行为。引用n4140(C ++ 14),[atomics.types.operations.req],强调我的:
在以下操作定义中:
- a A指的是原子类型之一。
[...]
A::A() noexcept = default;
效果:将原子对象保留为未初始化状态。 [注意:这些语义确保与C的兼容性。 - 结束注释]
as
在加载前未初始化。因此,关于未定义行为的常见方法必须遵循。
答案 1 :(得分:0)
根据cppreference,std::atomic::atomic()
构造函数没有初始化obj:
atomic() noexcept = default;
1)默认构造函数很简单:不进行初始化 除了静态和线程局部对象的零初始化。 std :: atomic_init可用于完成初始化。