让我们说,我们使用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没有为新元素指定显式值时执行的元素.
根据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.
| 归档时间: |
|
| 查看次数: |
786 次 |
| 最近记录: |