P45*_*ent 4 c++ integer stdvector value-initialization c++11
考虑
#include <vector>
int main()
{
std::vector<int> foo;
foo.resize(10);
// are the elements of foo zero?
}
Run Code Online (Sandbox Code Playgroud)
元素foo全为零吗?我认为它们是从 C++11 开始的。但想确切地知道。
元素
foo全为零吗?
是的,这可以从std::vector::resize 文档中看出:
如果当前大小小于 count,
- 附加额外的默认插入元素
默认情况下,这将调用 Placement-new,如
::new((void*)p) T()(C++20 之前)std::construct_at(p)(C++20 起)(即,对指向的对象进行值初始化p)。如果不需要值初始化,例如,如果对象是非类类型并且不需要清零,则可以通过提供自定义Allocator::construct.
(强调我的)
请注意T()上面引用的声明中的内容。这意味着调整大小后foo.resize(10);, 的元素foo将包含初始化值0时的值。
小智 6
简单回答:是的
\n长答案:
\n\n\n如果 n 大于当前容器大小,则通过在末尾插入所需数量的元素来扩展内容,\n以达到 n 的大小。如果指定了 val,则新元素将被初始化为\nval 的副本,否则,它们将被值初始化
\n
现在,作为标准的值初始化,我们得到:
\n\n\n\xe2\x80\x94 如果 T 是具有用户声明的构造函数的类类型(第 9 条)\n(12.1),则调用 T 的默认构造函数(如果 T 没有可访问的,则初始化是格式错误的)默认\n构造函数); \xe2\x80\x94 如果 T 是没有用户声明的构造函数的非联合类类型,则 T 的每个非静态数据成员和基类组件都会进行值初始化;\xe2\x80\x94 如果 T 是数组类型,则\n每个元素都是值初始化的;\xe2\x80\x94 否则,该对象\n零初始化
\n
int否则,它会被初始化为零