6

C++ では、常に false に初期化される新しい bool に依存できますか?

bool *myBool = new bool();

assert(false == *myBool);  // Always the case in a proper C++ implementation?

(コメントを反映するようにコードを更新しました。)

4

3 に答える 3

8

この場合、はい。しかし、その理由は非常に微妙です。

の括弧はvalue-initialisationnew bool()を引き起こし、それを として初期化します。それらがなければ、代わりにdefault-initialisationを行い、未指定の値のままにします。falsenew bool

new bool(false)個人的には、初期化する必要があることを明確にするために、可能であれば確認したいと思います。

(それは、使用する正当な理由があると仮定していnewます。たとえあったとしても、スマートポインタで管理する必要がありますが、それはこの質問の範囲を超えています)。

注:これは、私が読んだときと同じように質問に答えます。他の回答が書かれた後、その意味を変更するために編集されました。

于 2012-06-28T15:15:52.483 に答える
5

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
于 2012-06-28T15:32:25.307 に答える
2

いいえ。C++には自動初期化はありません。新しいブール値は、その時点でメモリ内にあったものに「初期化」されます。これは、真である可能性が高くなります(ゼロ以外の値が真であるため)が、どちらの方法でも保証はありません。

運が良ければ、うまく機能し、常に新しいブール値にfalse値を割り当てるコンパイラを使用する可能性がありますが、それはコンパイラに依存し、言語標準に基づいていません。

常に変数を初期化する必要があります。

于 2012-06-28T14:57:22.360 に答える