2016-05-16 163 views
-1

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

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

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

+1

它没有被调用,因为你正在初始化一个'std :: vector',而不是'A'。 – Rakete1111

+0

我知道v不是A,但是当向量的类型是A类型时,将如何创建向量v,编译器将如何为其分配资源?我的观点是编译器如何分配资源或稍后分配资源? – Adib

+1

如果您可以通过sizeof(A)来询问类的大小而不创建A的Object,那么编译器可以分配一个A的数组而无需构建它。 –

回答

6

当您构建矢量v时,它不包含A对象(因此不需要调用构造函数)。当填充v时,您明确地构造了A对象,然后将这些对象复制或移动到矢量中的内存中。

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

+0

我明白了,感谢你的确切回复 – Adib

0

线:

std::vector<A> vec; 

初始化std::vector米不是A。虽然它拥有A的实例,但尚未以可能导致创建实例A的方式进行初始化。

+0

我明白你的观点,现在投票plz – Adib

0

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

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

这解释了你的消息幽灵的次序和时间。