为什么在我初始化A
时没有调用std::vector
的默认构造函数?
std::vector<A> vec; //Doesn't call constructor
vec.push_back(A(2)); //Calls constructor
我不明白这一点,有人可以详细解释一下吗?
答案 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创建,然后在向量内部数组中被复制(或移动),并被销毁。
这解释了您的消息的显示顺序和时间。