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似乎是这样(见这里).
严格来说,我认为两个编译器都是正确的,因为您的程序表现出未定义的行为。引用 n4140 (C++14), [atomics.types.operations.req],强调我的:
\n\n\n\n\n在以下操作定义中:
\n\n\n
\n\n- A 指原子类型之一。
\n[...]
\n\nRun Code Online (Sandbox Code Playgroud)\n\nA::A() noexcept = default;\n效果:使原子对象处于未初始化状态。[ 注意:这些语义确保与 C 的兼容性。 \xe2\x80\x94 尾注 ]
\n
as在加载之前未初始化。因此,必须遵循有关未定义行为的常见说法。
| 归档时间: |
|
| 查看次数: |
231 次 |
| 最近记录: |