11

なぜ

struct wrapper
{
    explicit wrapper(void *);
    wrapper() = default;
    int v;
};

int main() { return wrapper().v; }  // You should run this in Debug mode

戻り0xCCCCCCCCますが、

struct wrapper { wrapper() = default; int v; };
int main() { return wrapper().v; }

struct wrapper { int v; };
int main() { return wrapper().v; }

両方とも戻り0ますか?

4

2 に答える 2

4

これは MSVC のバグのようです。3 つのケースすべてwrapperで、ユーザー提供のデフォルト コンストラクターがないため、wrapper()呼び出しによる初期化:

( n3690からのすべての引用)

(8.5/11) 初期化子が空の括弧のセット、つまり () であるオブジェクトは、値で初期化されます。

(dyp のおかげで)、これによりゼロ初期化が行われます。int v

次に、初期化により次のルールが参照されます。

(8.5/8) T が (おそらく cv 修飾された) クラス型であり、ユーザー提供または削除された既定のコンストラクターがない場合、オブジェクトはゼロで初期化され、既定の初期化のセマンティック制約がチェックされます。

ゼロ初期化規則は次のように述べています。

(8.5/6) T が (おそらく cv 修飾された) 非共用体クラス型である場合、各非静的データ メンバーと各基底クラス サブオブジェクトはゼロで初期化され、パディングはゼロ ビットで初期化されます。

int vのデータ メンバーであることは、wrapper以下に従ってゼロ初期化されます。

(8.5/6) T がスカラー型 (3.9) の場合、オブジェクトは整数リテラル 0 (ゼロ) を T に変換した値に初期化されます。

これはあなたが観察する行動ではありません。

于 2014-12-25T00:00:36.033 に答える