18

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、すべてのフィールドが呼び出されます(最後のポイントによる)。

それで、私はどこが間違っていますか?値の初期化の私の解釈は正しいですか?

4

2 に答える 2

34

Visual Studioには、現在のすべてのバージョン(2005、2008、2010)で既知のバグがあり、ユーザーがコンストラクターを宣言していない非PODタイプの値の初期化が正しく実装されていません。

言語規則により、誰も発砲すべきではないと主張しますが、コンパイラの問題を示します。これらはバグレポートの一部ですが、すべてクローズされているか、「修正されない」として解決されていることに注意してください。

http://connect.microsoft.com/VisualStudio/feedback/details/564268/c-value-initialization

http://connect.microsoft.com/VisualStudio/feedback/details/484295/vc-does-not-value-initialize-members-of-duced-classes-without-user-declared-constructor

http://connect.microsoft.com/VisualStudio/feedback/details/100744/value-initialization-in-new-expression

于 2010-10-14T08:56:21.860 に答える
8

私のように、2015年にこの質問に出くわした人のために:

上記の問題はすべてVS2015で修正されています。値の初期化は、標準で定義されているとおりに機能するようになりました。

于 2015-12-16T11:31:14.797 に答える