複製省略

複製省略或者譯作 “ 省略不必要的複製 ” （ copy elision ） ， 是C + + 語言標準中定義的編譯優化技術 。 當一個class類型的的臨時對象用於初始化同類型的對象時 ， 複製初始化通常優化爲直接初始化 ； 但在語義上仍然需要複製構造函數是可訪問的 。 例如 ： #include <iostream> struct C { explicit C ( int ) { } C ( const C & ) { std:: cout << " copy constructor " << std:: endl; } / / the copy constructor has a visible side effect }; / / it modifies an object with static storage duration int main { C c1 ( 42 ); / / direct - initialization, calls C:: C ( 42 ) C c2 = C ( 42 ); / / copy - initialization elision as direct - initialization, so as to call C:: C ( 42 ) return 0; } 上例 ， 在g + + 與Visual C++ 默認都是複製省略 。 throw語句拋出一個異常對象 ， catch語句匹配一個異常對象 ， 默認是要執行復制構造函數的 。 如下例 ： #include <iostream> struct C { C { } C ( const C & ) { std:: cout << " Hello World! \ n "; ; void f { C c; throw c; / / copying the named object c into the exception object. } / / 由於異常對象保存在線程信息塊TIB中 ， 這裏的複製構造不可省略. 這使得調用棧上壓棧保存的函數都有機會處理這個異常對象 int main { try { f; } catch ( C c ) { / / copying the exception object into the temporary in the exception declaration. } / / 由於這裏是傳值的catch批配 ， 因此複製初始化不可省略. 通常用於catch塊可能會修改異常對象的內容 ， 但又需要把原來的異常對象重新拋出 ( re-throw ) } 上例默認應該打印輸出兩次 " Hello World! " GCC的編譯選項 - fno - elide - constructors關閉複製省略 。