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



假设我们使用std::vector<int>std::vector<long>。随着向量大小的增长,新分配的元素默认情况下会初始化为0,还是程序员需要显式地将它们清零?

新的元素被值初始化:

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

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

对于intlong,这意味着0:

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

  • 如果T是具有用户提供的构造函数(12.1)的(可能是cv限定的)类类型(第9条),则调用T的默认构造函数(并且如果T没有可访问的默认构造函数,则初始化不正确)
  • 如果T是一个(可能是cv限定的)非并集类类型,没有用户提供的构造函数,则对象为零初始化,如果T隐式声明的默认构造函数是非平凡的,则调用该构造函数
  • 如果T是数组类型,则每个元素都被值初始化
  • 否则,对象初始化为零

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

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

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

void resize(size_type sz);

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

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

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

--如果T是具有用户提供的构造函数(12.1)的(可能是cv限定的)类类型(第9条),则调用了T的默认构造函数(如果T没有可访问的默认值,则初始化格式不正确构造函数);

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

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

--否则,对象初始化为零

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

是的,当std::vector更改大小时(可能是通过执行std::vector::resize),任何新元素都将初始化。对于intlong这样的类型,值初始化会导致零初始化,顾名思义,它会将值设置为0。

最新更新