Old*_*ier 11 c++ initialization atomic c++11 c++14
我发现在实践中,对于各种C++ 11/C++ 14编译器,a std::atomic
具有未定义的初始值,就像它是"原始"类型一样.也就是说,我们希望表达方式
int a;
Run Code Online (Sandbox Code Playgroud)
a
可能有任何价值.对于表达而言,事实证明也是如此
std::atomic< int > b;
Run Code Online (Sandbox Code Playgroud)
b
也可能有任何价值.换句话说,
std::atomic< int > b; // b is undefined
Run Code Online (Sandbox Code Playgroud)
不等于
std::atomic< int > b{ 0 }; // b == 0
Run Code Online (Sandbox Code Playgroud)
或者
std::atomic< int > b{}; // b == 0
Run Code Online (Sandbox Code Playgroud)
因为后两种情况b
被初始化为已知值.
我的问题很简单:在C++ 11或C++ 14规范中,这种行为记录在哪里?
Ker*_* SB 11
[atomics.types.generic]/5说这是关于整体专业化:
原子积分专业化和专业化原子应具有标准布局.它们每个都有一个普通的默认构造函数和一个普通的析构函数.它们应各自支持聚合初始化语法.
此外,同一节开头的主要模板概要规范性地将默认构造函数指定为:
Run Code Online (Sandbox Code Playgroud)atomic() noexcept = default;
效果在[atomic.types.operations]/4中定义为:
效果:使原子对象处于未初始化状态.
§29.6.5[atomics.types.operations.req] N 4140中的第4节(C++ 14的最终草案)说:
A ::A () noexcept = default;
效果:使原子对象处于未初始化状态.[ 注意:这些语义确保与C的兼容性. - 结束语 ]
请注意,这并不意味着对象包装了您可以读取但未依赖于其值的未指定值.相反,它意味着在分配对象之前从对象中读取值会导致未定义的行为.