1

コードを検討する

#include "stdafx.h"
#include <Windows.h>
#include <iostream>

struct B
{
public:
    void f() { for (auto &v : member) { std::cout << v << std::endl; } }
private:
    int member[100];
};

int main()
{
    B b{};
    b.f();
}

このコードは $8.5.4/3 でガイドされていると思います

型 T のオブジェクトまたは参照のリスト初期化は、次のように定義されます。
— 初期化子リストに要素がなく、T が既定のコンストラクターを持つクラス型の場合、オブジェクトは値で初期化されます。

代わりに、VS2013 コンパイラはすべての 0xCCCCCCCC を発行します。これは、b.member のすべての要素が初期化されていないままであることを意味します。したがって、値の初期化ではなく、デフォルトの初期化を実行しているようです。

何か不足している場合はお知らせください。

4

2 に答える 2

1

あなたが言いたいことはこれです:

int main()
{
    B b = {};  // = {} expresses that you want to zero-init the member vars
    b.f();
}

B に (既定ではない) コンストラクターまたはコンストラクターを持つメンバーがある場合、上記のコード サンプルを使用={}すると、コンパイラ エラーが発生する可能性があります。

于 2014-06-10T03:54:52.153 に答える
0

コード サンプルはさらに単純化できます。

#include <iostream>

struct B
{
public:
    void f() { std::cout << member << std::endl; }
private:
    int member;
};

int main()
{
    B b{};
    b.f();
}

これにより、次の出力が生成されます。

-858993460

これは0xCCCCCCCC16 進数で、VC コンパイラがデバッグ ビルドでメモリを埋めるデバッグ パターンです。こちら で報告されているように、これは VS2012 と VS2013 の両方で既知のバグのようです。

値がデータ メンバーを個別に初期化するコンストラクターを定義することで、エラーを回避できます。あなたの場合、このコンストラクターを追加すると、すべての要素member0

B() : member{} {}
于 2014-06-10T03:30:00.653 に答える