2017-09-25 9 views
1

を戻しながらこれは参考になるベクトルディープコピーが動作しない理由を誰かが私は機能ディープコピー動作機能から

からそれを返すとき、私はコンストラクタとコピーを持つ構造体を持って説明することができますですこの

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

[コピー - エリッションと戻り値の最適化](http://stackoverflow.com/questions/12953127/what-are-copy-elision-and-return-value-optimization)についていくつかの調査を行いたい場合があります。 –

答えて

3

それは*名前付き戻り値の最適化を実行するコンパイラだ」と書かれています。

vecの追加の一時コピーはではなく、が作成されています。

コンパイラは、に、コンソールメッセージを表示しないなどの副作用があっても、を実行することができます。

C++ 17以降、これはコンパイラが実装するためには必須です。

関連する問題