【发布时间】:2016-07-30 19:52:34
【问题描述】:
给定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 的初始化在零初始化后没有完成,因为std::is_trivially_constructible<decltype(gets_nullptr), int*>::value 是false(在至少,它在我的编译器上)。然而,我有点不清楚gets_nullptr 是否在常量初始化、静态初始化或动态初始化之后完全初始化。是哪个?
此外,为了争论,我有兴趣确保感兴趣的对象在零初始化后完全初始化并且不需要任何进一步的初始化,所以我使用gets_zero_init 方法.由于零初始化,嵌入在gets_zero_init 中的指针将保持全零位模式。
是否保证全零位模式等同于nullptr?换句话说,如果我想要gets_nullptr 的语义,我可以依靠gets_zero_init 的零初始化来提供吗?
【问题讨论】:
-
试过
std::is_trivially_constructible<decltype(gets_nullptr), std::nullptr_t>::value? -
@Yakk 是的,我实际上首先尝试过。刚刚仔细检查,同样的问题。编译器是
Apple LLVM version 7.3.0 (clang-703.0.31),使用libc++。
标签: c++ c++11 initialization