零初始化的std :: atomic <t *>保证等价于使用nullptr初始化的那个吗?

时间:2016-07-30 19:52:35

标签: c++ c++11 initialization

鉴于foo.cpp

#include <atomic>

namespace {
    std::atomic<int*> gets_zero_init;
    std::atomic<int*> gets_nullptr{nullptr};
}

我确信gets_zero_init是零初始化的,并且在零初始化之后它的初始化完成。我也相信gets_nullptr最终将使用nullptr初始化,我也相当确信gets_nullptr初始化在零初始化后未完成,因为{{1}是std::is_trivially_constructible<decltype(gets_nullptr), int*>::value(至少,它在我的编译器上)。然而,我不清楚false是否在常量初始化,静态初始化或动态初始化之后完全初始化。这是什么?

此外,让我们说,为了论证,我有兴趣确保感兴趣的对象在零初始化后完全初始化并且不需要任何进一步的初始化,所以我选择{{1}方法。嵌入在gets_nullptr中的指针将由于零初始化而保持全零位模式。

是否保证全零位模式等同于gets_zero_init?换句话说,如果我想要gets_zero_init的语义,我可以依靠nullptr的零初始化来提供吗?

1 个答案:

答案 0 :(得分:0)

我想我已经明白了。

首先,我的帖子中有错误。我没有意识到zero-init和constant-init只是静态init的不同形式。你会得到一个或另一个,而不是一个。所以,忽略那一点误解。

我相信,gets_zero_initgets_nullptr都会获得静态初始化。第一个得到零初始化,很明显。第二个得到恒定的初始化,因为:

  • 采用T的std :: atomic构造函数是constexpr
  • gets_nullptr的构造函数的参数是一个常量表达式

换句话说,gets_zero_initgets_nullptr都有静态初始化,因此后者是更好的选择,因为它不依赖假设全零位模式是等价的到nullptr。