C++ では、常に false に初期化される新しい bool に依存できますか?
bool *myBool = new bool();
assert(false == *myBool); // Always the case in a proper C++ implementation?
(コメントを反映するようにコードを更新しました。)
C++ では、常に false に初期化される新しい bool に依存できますか?
bool *myBool = new bool();
assert(false == *myBool); // Always the case in a proper C++ implementation?
(コメントを反映するようにコードを更新しました。)
この場合、はい。しかし、その理由は非常に微妙です。
の括弧はvalue-initialisationnew bool()
を引き起こし、それを として初期化します。それらがなければ、代わりにdefault-initialisationを行い、未指定の値のままにします。false
new bool
new bool(false)
個人的には、初期化する必要があることを明確にするために、可能であれば確認したいと思います。
(それは、使用する正当な理由があると仮定していnew
ます。たとえあったとしても、スマートポインタで管理する必要がありますが、それはこの質問の範囲を超えています)。
注:これは、私が読んだときと同じように質問に答えます。他の回答が書かれた後、その意味を変更するために編集されました。
bool に関連する 3 種類の初期化、ゼロ初期化、デフォルト初期化、および値初期化は、それぞれ、ブールが false に初期化されること、ブールが不確定な値を持つこと、およびブールが false に初期化されることを意味します。
したがって、ゼロまたは値の初期化を確実に行う必要があります。初期化子を指定せずに自動または動的ストレージ期間を持つオブジェクトを初期化すると、デフォルトの初期化が行われます。()
値の初期化を取得するには、または のいずれかの空の初期化子が必要です{}
。
bool b{}; // b is value-initialized
bool *b2 = new bool{}; // *b2 is value-initialized
class foo {
bool b;
foo() : b() {}
};
foo f; // // f.b is value-initialized
静的またはスレッド ローカル ストレージ期間があり、初期化子を持たない bool の初期化はゼロです。
static bool b; // b is zero-initialized
thread_local bool b2; // b2 is zero-initialized
ゼロ初期化が発生するもう 1 つのケースは、bool がユーザー提供のコンストラクターを持たないクラスのメンバーであり、暗黙のデフォルト コンストラクターが自明であり、クラス インスタンスがゼロまたは値で初期化されている場合です。
class foo {
bool b;
};
foo f{}; // f.b is zero-initialized
thread_local foo f2; // f2.b is zero-initialized
いいえ。C++には自動初期化はありません。新しいブール値は、その時点でメモリ内にあったものに「初期化」されます。これは、真である可能性が高くなります(ゼロ以外の値が真であるため)が、どちらの方法でも保証はありません。
運が良ければ、うまく機能し、常に新しいブール値にfalse値を割り当てるコンパイラを使用する可能性がありますが、それはコンパイラに依存し、言語標準に基づいていません。
常に変数を初期化する必要があります。