1時間前、私はここに答えを投稿しましたが、それは私によれば正しかったです。しかし、私の答えはマーティンBによって反対されました。彼は言った
私が置かれたメモリがたまたまゼロで初期化されたので、あなたは幸運でゼロを取得しています。これは規格によって保証されていません。
ただし、ここでMichael Burrの回答を読み、次のサンプルコードを試した後
1)
#include <cassert>
struct B { ~B(); int m; };
int main()
{
B * b = new B();
assert(b->m == 0);
}
MSVC++2010でデバッグエラーが発生しました。
MSVC ++ 2010で次のコード[ここに私の答え]を試したときに、同様のエラーが発生しました
2)
#include <cassert>
struct Struct {
std::string String;
int Int;
bool k;
// add add add
};
struct InStruct : Struct
{
InStruct() : Struct() {}
};
int main()
{
InStruct i;
assert(i.k == 0);
}
MSVC++2010がC++03をサポートしていないかどうかを考えさせられる、gcc/Clangでのそのようなエラーも発生し(1)
ませんでした。(2)
私はわかりません。
MichaelBurrの投稿によると[C++03で]
new B()- value-デフォルトのctorはユーザー定義ではなくコンパイラー生成であるため、すべてのフィールドをゼロで初期化するBを値初期化します。
規格によると
タイプTmeansのオブジェクトを値初期化するには:
— Tがユーザー宣言コンストラクター(12.1)を持つクラスタイプ(9節)の場合、Tのデフォルトコンストラクターが呼び出されます(アクセス可能なデフォルトコンストラクターがない場合、初期化は不正な形式になります)。
....。
それ以外の場合、オブジェクトはゼロで初期化されます
最初のポイントから、ユーザーが宣言したデフォルトコンストラクターがない場合、コンパイラーで合成されたデフォルトコンストラクターが呼び出されzero initialize
、すべてのフィールドが呼び出されます(最後のポイントによる)。
それで、私はどこが間違っていますか?値の初期化の私の解釈は正しいですか?