我有这个结构定义:
struct inner
{
int i;
std::string str;
};
struct outer
{
inner member[32];
};
现在我想创建一个outer
的值初始化实例,所以我写了
outer o = {};
使用GCC,这很好用:所有inner.i
都归零,所有inner.str
都为空。但是在VS2013上,只有inner.str
为空;所有inner.i
都包含垃圾,但没有正确初始化。
如果没有std::string
成员,inner.i
的零初始化将与VS2013一起使用。
标准对此有何评价?我总是假设{}
通过归零或调用默认构造函数来初始化所有内容。我错了还是VS2013中的一个非常糟糕的错误?
答案 0 :(得分:2)
如果初始化程序子句的数量小于成员数或初始化程序列表完全为空,则其余成员由其默认初始化程序初始化(如果在类定义中提供),否则(从C ++开始) 14)通过空列表执行值初始化。
值初始化意味着member
的每个元素都是值初始化的,这反过来意味着i
应该为零。
是的,这是一个VS2013错误。