為什麼 C++ 列表初始化時會執行兩次拷貝構造函數?
01-06
在做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 |