什么是std :: atomic的默认值?

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说这是关于整体专业化:

原子积分专业化和专业化原子应具有标准布局.它们每个都有一个普通的默认构造函数和一个普通的析构函数.它们应各自支持聚合初始化语法.

此外,同一节开头的主要模板概要规范性地将默认构造函数指定为:

atomic() noexcept = default;
Run Code Online (Sandbox Code Playgroud)

效果在[atomic.types.operations]/4中定义为:

效果:使原子对象处于未初始化状态.


5go*_*der 7

§29.6.5[atomics.types.operations.req] N 4140中的第4节(C++ 14的最终草案)说:

A ::A () noexcept = default;

效果:使原子对象处于未初始化状态.[ 注意:这些语义确保与C的兼容性. - 结束语 ]

请注意,这并不意味着对象包装了您可以读取但未依赖于其值的未指定值.相反,它意味着在分配对象之前从对象中读取值会导致未定义的行为.

  • 在这里,未初始化实际上非常重要.考虑如果从数据库文件中映射一个共享内存块会发生什么情况,在该文件中,当您下降树结构时,使用原子来锁定每个BTree节点.当然,您不希望在打开文件时将代码值设置为零. (3认同)