#include <iostream>
using namespace std;
struct A {
// Some Other Code
int x;
};
A a1;
int main(){
A a2;
cout << "a1.x = " << a1.x << endl;
cout << "a2.x = " << a2.x << endl;
return 0;
}
C++14 標準 (ISO/IEC 14882:2014) セクション 8.5、パラグラフ 12:
オブジェクトに初期化子が指定されていない場合、オブジェクトはデフォルトで初期化されます。自動または動的ストレージ期間を持つオブジェクトのストレージが取得されると、オブジェクトの値は不定になり、オブジェクトの初期化が実行されない場合、そのオブジェクトはその値が置き換えられるまで不定値を保持します (5.17)。[ 注: 静的またはスレッド ストレージ期間を持つオブジェクトはゼロで初期化されます。3.6.2 を参照してください。- 終了注記】
a1
静的ストレージ期間がa2
あり、自動ストレージ期間がありますか? の定義は宣言Struct A
と同様にグローバル名前空間にありますが、宣言はブロック スコープ (関数内) にあります。a1
a2
main()
また、セクション 3.6.2 は次のように述べています。
段落1:
静的記憶域期間を持つ非ローカル変数は、プログラムの開始の結果として初期化されます。
パラグラフ 2:
静的保存期間 (3.7.1) またはスレッド保存期間 (3.7.2) を持つ変数は、他の初期化が行われる前にゼロで初期化されます (8.5)。
その上、gcc 5.4.0 では警告 ( warning: 'a2.A::x' is used uninitialized in this function [-Wuninitialized]
) とランダムな値が表示されますが、clang 3.8.0 では常に出力されますa2.x = 0
(ゼロは不確定な値になることもあります)。struct
また、ネストされたとデフォルトの初期化を に配置して、他のより複雑な実験も行いました// Some Other Code
。ランダムな値を取得することもあれば、ゼロを取得することもあります (無視できる数ではありません)。
Struct の保存期間は
A
? そして、オブジェクトa1
とa2
?そして、変数a1.x
とa2.x
?ゼロ
a1.x
でa2.x
初期化する必要がありますか? それとも不定値ですか?と に同じ規則が適用され
class
ますunion
か?のコードに違いはあります
// Some Other Code
か?たとえば、クラス T が「デフォルトの初期化子を持つ非静的メンバを持つ」( のようにstruct A { int b = 1; int x; };
) 場合、デフォルトのコンストラクタは自明ではありません (つまり、アクションを実行できません)。その重要なコンストラクターも初期化しx
ますか? 自明なデフォルト コンストラクタ
興味深いリンク:
C++ 構造体のメンバーはデフォルトで 0 に初期化されていますか?