爲什麼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的數組而無需構建它。 –