新分配的std :: vector <int>元素是否初始化为0?

Met*_*est 4 c++ stl vector

让我们说,我们使用std::vector<int>std::vector<long>.随着向量的大小增加,默认情况下新分配的元素是否会被初始化为0,或者程序员是否需要显式地将它们归零?

Lig*_*ica 10

元素是价值初始化的:

[C++11: 23.3.6.3/9]: void resize(size_type sz);

效果:如果sz <= size(),相当于erase(begin() + sz, end());.如果size() < sz,将sz - size() 值初始化元素附加到序列.

对于两者而言int,long这意味着0:

[C++11: 8.5/7]: 对值初始化类型的对象T意味着:

  • if T是一个(可能是cv限定的)类类型(第9节)和一个用户提供的构造函数(12.1),然后T调用默认构造函数(如果T没有可访问的默认构造函数,则初始化是错误的);
  • 如果T是没有用户提供的构造函数的(可能是cv限定的)非联合类类型,则该对象是零初始化的,如果T隐式声明的默认构造函数是非平凡的,则调用该构造函数.
  • 如果T是数组类型,则每个元素都是值初始化的;
  • 否则,该对象被零初始化.

值初始化的对象被视为构造,因此受本国际标准的规定适用于"构造"对象,"构造函数已完成的对象"等,即使没有为该对象调用构造函数也是如此.初始化.

但请注意,这并不是在向量的末尾讨论"保留"空间.此空间不包含任何有效元素,零初始化或其他.这个答案和标准措辞只讨论了在resize没有为新元素指定显式值时执行的元素.


And*_*owl 6

根据C++ 11标准的第23.3.6.3/9段(约std::vector::resize()):

void resize(size_type sz);

效果:如果sz <= size(),相当于erase(begin()+ sz,end());. 如果size()<sz,则将sz-size()值初始化元素追加到序列中.

此外,根据标准第8.5/7段:

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

- 如果T是具有用户提供的构造函数(12.1)的(可能是cv限定的)类类型(第9节),则调用T的默认构造函数(如果T没有可访问的默认构造函数,则初始化是错误的);

- 如果T是一个(可能是cv限定的)非联合类类型而没有用户提供的构造函数,那么该对象是零初始化的,如果T的隐式声明的默认构造函数是非平凡的,则调用该构造函数.

- 如果T是数组类型,则每个元素都是值初始化的;

- 否则,对象被零初始化.

这意味着在int新创建的元素被初始化为值的情况下0.