は、このコードスニペット一時オブジェクトの混乱
struct S{ int i; int j;};
int main()
{
assert(S().i == S().j) // is it guaranteed ?
}
なぜを見たことがありますか?
は、このコードスニペット一時オブジェクトの混乱
struct S{ int i; int j;};
int main()
{
assert(S().i == S().j) // is it guaranteed ?
}
なぜを見たことがありますか?
保証はありますか?
はい、これは保証されています。 S().i
とS().j
の値は0
になります。 ()
は14882 C++標準ISO/IECからvalue initialization.(すなわちS
が既定のコンストラクタユーザ定義せずにクラスであるためi
とj
がゼロに初期化される手段)
を暗示:2003(E)3.6.2
を指し静止保存期間(3.7.1)を持つオブジェクトは、他の初期設定 が実行される前に、ゼロで初期化されます(8.5)。
これは、両方の変数がゼロで初期化されているので有効です。
静的なストレージ割り当てがあるオブジェクトは表示されません。式 'S()'は、 'assert()'のスコープにローカル**の一時オブジェクト**を作成します。 –
セクション8.5の初期化の一般的なケースについて説明します。 – birryree
申し訳ありません...どういうわけか私は彼がグローバル変数 –
技術的には、はい。 Visual Studioのコンパイラは通常、初期化されていない変数をデバッグビルドの特定のパターンに初期化します)。これらの変数は0
に初期化されます。
しかし、コードレビューに参加していた場合は、変数を明示的に初期化していないと怒鳴られても驚かないでください。
を使用していると思っています。括弧のために()。 –
うわー!!!! Thnxたくさん。 – Bollinger
特に 'struct S 'に' S(){} '(無意味なユーザ定義のctor)を追加すると、' i'と 'j'は初期化されずに残されます。つまり、' assertトリガーする。 –
はいいいえ[.....] –