为什么VS2013没有对这个结构进行零初始化?

时间:2015-01-21 11:11:45

标签: c++ visual-studio-2013

使用Microsoft Visual Studio Ultimate 2013更新4和以下代码:

#include <iostream>

auto main() -> int {
    struct Base { int a; };
    struct Derived : Base { int b; };

    auto foo = Derived();

    std::cout << foo.a << " " << foo.b;
}

我得到了这个输出:

-858993460 -858993460

但我期待:

0 0

为什么foo没有进行零初始化?

2 个答案:

答案 0 :(得分:4)

应该初始化为零,看起来像MSVC bug。 实际上你的代码就是这样的

Derived foo{Derived()};

然后将使用()初始化的临时对象调用复制/移动构造函数。

n3376 8.5 / 10

  

一个对象,其初始化程序是一组空的括号,即(),   应进行价值初始化。

n3376 8.5 / 7

  

对T类型的对象进行值初始化意味着:

     

如果T是(可能是cv认证的)非联合类类型没有a   用户提供或删除的默认构造器,然后对象是   零初始化,如果T有一个非平凡的默认构造函数,   缺省初始化;

n3376 8.5 / 5

  

零初始化T类型的对象或引用意味着:

     

如果T是(可能是cv限定的)非联合类类型,则   非静态数据成员和每个基类子对象是   零初始化和填充初始化为零位;

答案 1 :(得分:0)

您的结构没有构造函数,因此创建了默认构造函数。

结构的默认构造函数将为每个成员调用默认构造函数。

int的默认构造函数未初始化它。所以int memeber将包含随机数据。

在结构中添加构造函数并初始化成员。像这样:

struct Base
{
    Base(): a(0) {}
    int a;
};