为什么A
的默认构造函数在初始化std::vector
时没有调用?为什么不初始化std :: vector <T>初始化T?
std::vector<A> vec; //Doesn't call constructor
vec.push_back(A(2)); //Calls constructor
我不明白这一点,请有人详细解释一下吗?
为什么A
的默认构造函数在初始化std::vector
时没有调用?为什么不初始化std :: vector <T>初始化T?
std::vector<A> vec; //Doesn't call constructor
vec.push_back(A(2)); //Calls constructor
我不明白这一点,请有人详细解释一下吗?
当您构建矢量v
时,它不包含A
对象(因此不需要调用构造函数)。当填充v
时,您明确地构造了A
对象,然后将这些对象复制或移动到矢量中的内存中。
从来没有任何默认构造的A
对象,所以默认的构造函数永远不会被调用(如果您将其标记为= delete
,您的代码将很好地编译)。
我明白了,感谢你的确切回复 – Adib
线:
std::vector<A> vec;
初始化std::vector
米不是A
。虽然它拥有A
的实例,但尚未以可能导致创建实例A
的方式进行初始化。
我明白你的观点,现在投票plz – Adib
创建vector<A>
时,只需初始化底层向量基础结构,并具有足够的内存来容纳一堆A
元素,但此时不会初始化A
,因此不必调用它。
当你推回一个(临时的)A(25)
时,首先从其简单的ctor创建临时的,然后它被复制(或移动)到矢量内部数组中,并被销毁。
这解释了你的消息幽灵的次序和时间。
它没有被调用,因为你正在初始化一个'std :: vector',而不是'A'。 – Rakete1111
我知道v不是A,但是当向量的类型是A类型时,将如何创建向量v,编译器将如何为其分配资源?我的观点是编译器如何分配资源或稍后分配资源? – Adib
如果您可以通过sizeof(A)来询问类的大小而不创建A的Object,那么编译器可以分配一个A的数组而无需构建它。 –