使用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
没有进行零初始化?
答案 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;
};