通过在这里工作,我认为std::atomic<T> a{}有效的零初始化a.我一直在这么想,并一直在使用它直到这个.在解释我对此的理解之前,我想表明,至少,gcc和clang正在实践中这样做.
#include <cstring>
#include <atomic>
#include <iostream>
int main() {
using atomic = std::atomic<int>;
auto p = (atomic*)operator new(sizeof(atomic));
std::memset(p, -1, sizeof(atomic));
new(p) atomic{};
std::cout << p->load() << std::endl;
}
Run Code Online (Sandbox Code Playgroud)
以下是我解释为什么这应该起作用(当然,你可能会这样想).标准说
在以下操作定义中:
- A指的是原子类型之一.
[...]
Run Code Online (Sandbox Code Playgroud)A::A() noexcept = default;效果:使原子对象处于未初始化状态.[注意:这些语义确保与C的兼容性. - 结束语]
它基本上说默认构造函数是微不足道的,什么都不做.我对此很好,但我不知道这是如何使值初始化不适用的.根据cppref,值初始化的影响包括(强调我的):
如果T是一个类型,其默认构造函数既不是用户提供也不是删除(也就是说,它可能是一个具有隐式定义或默认默认构造函数的类),该对象是零初始化的,然后它是默认的 -如果它有一个非平凡的默认构造函数,则初始化;
std::atomic 有一个默认的默认构造函数,所以对象是
点2在这里不适用,因为默认的默认构造函数是微不足道的,但我没有看到任何使得第1点无效的语句.我的理解是正确的还是我错过了什么?