2016-05-16 111 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創建臨時的,然後它被複制(或移動)到矢量內部數組中,並被銷燬。

這解釋了你的消息幽靈的次序和時間。