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

时间:2016-05-16 10:08:00

标签: c++ vector

为什么在我初始化A时没有调用std::vector的默认构造函数?

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

我不明白这一点,有人可以详细解释一下吗?

3 个答案:

答案 0 :(得分:6)

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

永远不会有任何默认构造的A对象,因此永远不会调用默认构造函数(如果您将代码标记为= delete,您的代码将编译正常)。

答案 1 :(得分:0)

该行:

std::vector<A> vec;

初始化std::vector m而不是A。虽然它保持A的实例尚未以导致A实例创建的方式进行初始化。

答案 2 :(得分:0)

创建vector<A>时,只初始化底层矢量基础架构,并且有足够的内存来容纳一堆A元素,但当时没有初始化A,所以不能召唤一个人。

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

这解释了您的消息的显示顺序和时间。