包含原始类型的struct容器,零初始化?

And*_*zos 7 c++ c++14

#include <vector>
struct S { int x; };
std::vector<S> v;
int main() { v.resize(1000); return v[42].x; }
Run Code Online (Sandbox Code Playgroud)

上述程序是否保证在C++ 14中返回0?为什么?

Bau*_*gen 3

是的,因为std::vector::resize类似的方法默认执行值初始化\xe2\x80\xa0,这反过来又对聚合的成员进行值初始化:

\n\n

来自CPPR:

\n\n
\n

值初始化的效果是:
\n [...]
\n 如果 T 是一个具有既不是用户提供的也不是删除的默认构造函数的类类型(也就是说,它可能是一个具有隐式定义或默认构造函数的类)默认构造函数),该对象被零初始化,然后如果它有一个非平凡的默认构造函数,则它被默认初始化;

\n
\n\n

初始化部分满足我们的需要:

\n\n
\n

如果 T 是非联合类类型,则所有基类和非静态数据成员都初始化为零,并且所有填充都初始化为零位。构造函数(如果有)将被忽略。

\n
\n\n

当然,我们的成员的零初始化做了正确的事情:

\n\n
\n

如果 T 是标量类型,则对象的初始值是显式转换为 T 的整数常量零。

\n
\n\n
\n\n

\xe2\x80\xa0默认分配器执行此操作,自定义分配器可能使用不同的初始化。您可以使用它们来保留这些值的单位化,请参阅有关default-insert的完整文章。

\n