はfoo.cpp
を考える:ゼロ初期化されたstd :: atomic <T*>はnullptrで初期化されたものと等価ですか?
#include <atomic>
namespace {
std::atomic<int*> gets_zero_init;
std::atomic<int*> gets_nullptr{nullptr};
}
私はgets_zero_init
がゼロに初期化され、その初期化がゼロ初期化後に完了したことをことを確信しています。私はまたgets_nullptr
が最終的にnullptr
で初期化されると確信しています。またstd::is_trivially_constructible<decltype(gets_nullptr), int*>::value
がfalse
(少なくとも私のコンパイラにあります)のため、gets_nullptr
の初期化はゼロ初期化後に完全ではないと確信しています。しかし、私は、gets_nullptr
がconstant init、static init、またはdynamic initの後に完全に初期化されているかどうかについて少しはっきりしていません。どちらですか?
また、0の初期化の後に目的のオブジェクトが完全に初期化され、それ以上の初期化は必要ないことを確認することに興味がありますので、私はgets_zero_init
というアプローチを採用します。 gets_zero_init
に埋め込まれたポインタはゼロ初期化のためにオールゼロビットパターンを保持します。
オールゼロビットパターンがnullptr
と等価であることは保証されていますか?言い換えれば、私がgets_nullptr
のセマンティクスを望むなら、それを提供するためにgets_zero_init
のゼロ初期化に頼ることができますか?
'std :: is_trivially_constructible :: value'を試しましたか? –
Yakk
@ヤクはい、私は実際にそれを最初に試みました。ダブルチェック、同じ問題。コンパイラはlibC++を使った 'Apple LLVM version 7.3.0(clang-703.0.31)'です。 – acm