2017-09-25 79 views
1

這將是有幫助的是有人能解釋爲什麼矢量深拷貝不工作時,我從一個函數返回它深複製行爲

我有一個構造函數和拷貝一個struct構造這樣

struct { 
    A() { cout<<"Constructor..."<<endl; } 
    A(const A &) { cout<<"Copy Constructor...."<<endl; 
}; 

如果我寫這樣

int main() { 
    A a1; // constructor gets called here 
    vector<A> vec; 
    vec.push_back(a1) // Copy constructor gets called here 

    vector<A> copyvec = vec; // Again copy constructor gets called here 
} 

主程序但是,如果我改變這樣

代碼
vector<A> retvecFunc() { 
    A a1; // Constructor gets called 
    vector<A> vec; 
    vec.push_back(a1); // Copy Constructor gets called 

    return vec; // copy constructor **DOESN'T GETS CALLED** 
} 

我的主要功能是寫成

int main() { 
    vector<A> retVec = retvecFunc(); 
    return 0; 
} 
+0

你可能想做一些關於[copy-elision和返回值優化]的研究(http://stackoverflow.com/questions/12953127/what-are-copy-elision-and-return-value-optimization)。 –

回答

3

這是實現*命名返回值優化編譯器」。

vec的額外臨時副本是而不是創建。

即使存在副作用(例如,在您的情況下未打印控制檯消息),編譯器也可以這樣做

從C++ 17開始,這對編譯器來說是強制實施的。