std::atomic 的默认值是多少?
What's the default value for a std::atomic?
我发现在实践中,对于各种 C++11/C++14 编译器,std::atomic
具有未定义的初始值,就像它是 "raw" 一样类型。也就是说,我们期望表达式
int a;
a
可能有任何值。事实证明,对于表达式
std::atomic< int > b;
b
也可能有任何值。换句话说,
std::atomic< int > b; // b is undefined
不等于
std::atomic< int > b{ 0 }; // b == 0
或到
std::atomic< int > b{}; // b == 0
因为后两种情况b
被初始化为已知值
我的问题很简单:在 C++11 或 C++14 规范中的何处记录了此行为?
[atomics.types.generic]/5 关于积分特化的说法:
The atomic integral specializations and the specialization atomic shall have standard layout. They shall each have a trivial default constructor and a trivial destructor. They shall each support aggregate
initialization syntax.
此外,同一节开头的主要模板概要规范地将默认构造函数指定为:
atomic() noexcept = default;
效果在 [atomic.types.operations]/4 中定义为:
Effects: leaves the atomic object in an uninitialized state.
§ 29.6.5 [atomics.types.operations.req] N 4140 的第 4 节(C++14 的最终草案)说:
A ::A () noexcept = default;
Effects: leaves the atomic object in an uninitialized state. [ Note: These semantics ensure compatibility with C. — end note ]
请注意,这并不意味着该对象包装了一个您可以读取但不依赖于其值的未指定值。相反,这意味着在分配给对象之前从对象中读取值会导致未定义的行为。
我发现在实践中,对于各种 C++11/C++14 编译器,std::atomic
具有未定义的初始值,就像它是 "raw" 一样类型。也就是说,我们期望表达式
int a;
a
可能有任何值。事实证明,对于表达式
std::atomic< int > b;
b
也可能有任何值。换句话说,
std::atomic< int > b; // b is undefined
不等于
std::atomic< int > b{ 0 }; // b == 0
或到
std::atomic< int > b{}; // b == 0
因为后两种情况b
被初始化为已知值
我的问题很简单:在 C++11 或 C++14 规范中的何处记录了此行为?
[atomics.types.generic]/5 关于积分特化的说法:
The atomic integral specializations and the specialization atomic shall have standard layout. They shall each have a trivial default constructor and a trivial destructor. They shall each support aggregate initialization syntax.
此外,同一节开头的主要模板概要规范地将默认构造函数指定为:
atomic() noexcept = default;
效果在 [atomic.types.operations]/4 中定义为:
Effects: leaves the atomic object in an uninitialized state.
§ 29.6.5 [atomics.types.operations.req] N 4140 的第 4 节(C++14 的最终草案)说:
A ::A () noexcept = default;
Effects: leaves the atomic object in an uninitialized state. [ Note: These semantics ensure compatibility with C. — end note ]
请注意,这并不意味着该对象包装了一个您可以读取但不依赖于其值的未指定值。相反,这意味着在分配给对象之前从对象中读取值会导致未定义的行为。