C++ 为什么';t初始化std::vector<;T>;初始化T?

C++ 为什么';t初始化std::vector<;T>;初始化T?,c++,vector,C++,Vector,为什么在初始化std::vector时没有调用A的默认构造函数 std::vector<A> vec; //Doesn't call constructor vec.push_back(A(2)); //Calls constructor std::向量向量向量机//不调用构造函数 向量推回(A(2))//调用构造函数 我不明白,有人能详细解释一下吗?这句话: std::vector<A> vec; std::向量向量向量机; 初始化std::vectorm而不是

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

std::vector<A> vec; //Doesn't call constructor
vec.push_back(A(2)); //Calls constructor
std::向量向量向量机//不调用构造函数
向量推回(A(2))//调用构造函数
我不明白,有人能详细解释一下吗?

这句话:

std::vector<A> vec;
std::向量向量向量机;

初始化
std::vector
m而不是
a
。尽管它包含
A
的实例,但它的初始化方式并没有导致创建
A
的实例。

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


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

当您创建
向量时,您只需初始化底层向量基础结构,并有足够的内存来容纳一堆
A
元素,但是当时没有初始化
A
,因此不需要调用任何一个ctor

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


这解释了消息的出现顺序和时间。

之所以不调用它,是因为您正在初始化一个
std::vector
,而不是
a
。我知道v不是a,但当向量类型是一种类型时,向量v将如何创建,编译器将如何为其分配资源?我的观点是编译器将如何分配资源,或者以后如何分配资源?如果您可以按sizeof(A)询问类的大小,而不创建A的对象,那么编译器可以分配A的数组,而无需对其进行构造。@user5905343向量最初为空,不包含
A
,所以没有什么需要构造的。为什么需要构造一个
A
来构造一个空向量?