为什么初始化 std::vector 不<T>初始化 T?

Why doesn't initializing a std::vector<T> initialize T?

本文关键字:初始化 gt std vector 为什么 lt      更新时间:2023-10-16

当我像这样初始化std::vector时,为什么不调用A的默认构造函数?

std::vector<A> vec; //Doesn't call constructor
vec.push_back(A(2)); //Calls constructor

我不明白,有人能详细解释一下吗?

构造向量v时,它不包含A对象(因此不需要调用构造函数)。在填充v时,显式构造A对象,然后将这些对象复制或移动构造到向量中的内存中。

从来没有任何默认构造的A对象,因此永远不会调用默认构造函数(如果将其标记为= delete,则代码编译良好)。

行:

std::vector<A> vec;

初始化CCD_ 9m而不是CCD_。尽管它持有A的实例,但它尚未以导致创建A实例的方式进行初始化。

当您创建vector<A>时,您只初始化底层向量基础结构,具有足够的内存来容纳一堆A元素,但此时没有初始化A,因此不必调用任何ctor。

当您推回(临时)A(25)时,首先从其简单的ctor创建临时,然后在向量内部数组中复制(或移动)并销毁它。

这就解释了你的信息出现的顺序和时间。