鉴于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
的零初始化来提供吗?
答案 0 :(得分:0)
我想我已经明白了。
首先,我的帖子中有错误。我没有意识到zero-init和constant-init只是静态init的不同形式。你会得到一个或另一个,而不是一个。所以,忽略那一点误解。
我相信,gets_zero_init
和gets_nullptr
都会获得静态初始化。第一个得到零初始化,很明显。第二个得到恒定的初始化,因为:
gets_nullptr
的构造函数的参数是一个常量表达式换句话说,gets_zero_init
和gets_nullptr
都有静态初始化,因此后者是更好的选择,因为它不依赖假设全零位模式是等价的到nullptr。