0

値の初期化と集計の初期化が混在しているという問題に直面しています。これまでのところ、すべての初期化を次のように行うことに依存しようとしました。

auto var = タイプ{};

(はい、brace-initializer ctor と default ctor の落とし穴を認識しています。そのため、それについてのコメントはありません!)

これにより、var のメモリが適切に「ゼロ アウト」または初期化されることを期待しています。

しかし、VS 2013 Update 2 では、次のように表示されます。

#include <string>
#include <iostream>

using namespace std;


struct B
{
    double g[10];
    std::string str;
};

struct C
{
    double g[10];
};

struct A
{
    double a[3];
    double b = 0;
    double d;
    struct B b_stuff;
    struct C c_stuff;
    A() : b_stuff{}, c_stuff{} {}
};

int main()
{
    auto a = A{};
    double big[50] = {};

    for(auto b : a.b_stuff.g) { cout << b << " "; }
    cout << endl;
    cout << endl;
    for(auto b : a.c_stuff.g) { cout << b << " "; }
    cout << endl;
    cout << endl;
    for (auto b : big) {  cout << b << " "; }

    return 0;
}

出力は次のとおりです。

-9.25596e+061 -9.25596e+061 -9.25596e+061 -9.25596e+061 -9.25596e+061 -9.25596e+061 -9.25596e+061 -9.25596e+061 -9.25596e+061 -9.25596e+061

0 0 0 0 0 0 0 0 0 0

0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0

GCC 4.7.2 の場合:

0 0 0 0 0 0 0 0 0 0 

0 0 0 0 0 0 0 0 0 0 

0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 

私はこれを読みましたが、この非ゼロ化動作の理由がわかりません:

http://en.cppreference.com/w/cpp/language/value_initialization http://en.cppreference.com/w/cpp/language/aggregate_initialization

では、VS 2013 にはバグがありますか? a.b_stuff.g 配列をゼロにしないのはなぜですか?

4

1 に答える 1