值初始化与聚合初始化

时间:2014-07-10 12:33:33

标签: c++ c++11 visual-c++-2013

我遇到了与初始化混合的值初始化问题。 到目前为止,我试图依靠这样做我的所有初始化:

auto var = Type {};

(是的,我知道bra-initializer ctor vs default ctor pitfall。所以请不要评论!)

我希望这会正确地“清零”或初始化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数组归零?

1 个答案:

答案 0 :(得分:2)

Visual C ++有a long and storied history of value initialization bugs。我相信Bug 746973就是你在这里偶然发现的那个。