2011-10-06 87 views
1

我碰到這個例子來自加速C++當參數傳遞參數時,爲什麼在函數參數上調用複製構造函數?

vector<string> func(const string&); //function declaration 

vector<string> v; 
string line = "abc"; 

v = func(line); //on entry, initialization of func's single parameter from line 
     //on exit, both initialization of the return value and then assignment to v 

我的問題是,因爲FUNC需要一個常量字符串引用作爲參數,爲什麼拷貝構造函數調用時進入FUNC?由於行被引用傳遞不func只是保持其本地堆棧上的行的引用?

+1

是什麼讓你認爲複製構造函數被調用? –

+0

這就是本書暗示的「在入口,func的參數從行初始化」的評論 – Jeff

+1

我看不到函數體 - 你將該字符串添加到向量? stl容器具有傳值語義 – alexm

回答

5

入境,「從line

func S單參數的參數func的初始化line初始化,但它不是一個string,但提及它。它的初始化不會導致對拷貝構造函數的調用,但它會使該參數成爲line的別名(通常在初始化引用時發生)。

+0

這似乎是對文本最可能的解釋 – Jeff

1

這個例子並不完全正確。正如你已經注意到的那樣,函數參數是通過const引用傳遞的,並且沒有涉及轉換,所以沒有複製構造函數涉及它。另一方面,結果可能是調用複製構造函數,從返回值到矢量v,這取決於你的函數是如何聲明的。現在大多數編譯器都實現了RVO和NRVO,它們允許標準的優化避免了這種複製結構。瞭解更多關於在這裏:​​

http://cpp-next.com/archive/2009/08/want-speed-pass-by-value/