標籤:

為什麼 C++ 列表初始化時會執行兩次拷貝構造函數?

在做c++ primer 5th練習13.13時對vector使用列表初始化時,拷貝構造函數會被調用兩次,請問是什麼原因。

#include &
#include &
struct X {
X() { std::cout &<&< "X()" &<&< std::endl; }; X(const X) { std::cout &<&< "X(const X)" &<&< std::endl; }; X operator = (const X) { std::cout &<&< "X operator = (const X)" &<&< std::endl; return *this; }; ~X() { std::cout &<&< "~X()" &<&< std::endl; }; }; int main(){ { X x; std::vector& vec_x{ x };
}
}

運行結果


一次拷貝到 initializer_list,另一次拷貝到 vector。


是這樣的,因為vector並沒有接受一個T作為參數的構造函數,所以編譯器會選擇initializer_list的版本,這就需要先構造一個initializer_list再傳給vector,就會被拷貝兩次。


ilist的構造

ilist的構造會浪費一定時間,而且用的是拷貝構造,也沒法move,所以在使用巨型class的時候少用ilist


你可以看一下effective modern c++中的item7


學會用調試跟蹤進函數看執行上下文。


推薦閱讀:

寫循環語句,循環體部分理論上是不是可以都寫在for(;;)第二個分號後?
map key是一個複雜結構,為什麼無法插入?
C++構造函數參數列表初始化與直接在函數內部初始化有何區別?
C++ 的 string 為什麼不提供 split 函數?
C++函數返回值拷貝問題?

TAG:C |