理解

2017-01-26 2 views
2

私はint型格納構造体があります。私はいつものコンストラクターがあることを期待している時点で、理解

foo bar = foo(foo(foo(42))); 

:私は次のようんmainメソッドで

struct foo { 
    int value; 

    foo(int value) : value(value) { 
     std::cout << "value constr\n"; 
    } 

    foo(foo const&) { 
     std::cout << "copy constr\n"; 
    } 

    foo(foo&&) { 
     std::cout << "move constr\n"; 
    } 
}; 

をその引数が右辺値になるため、コンストラクタを何度も移動します。ただし、出力は "value constr"のみです。

なぜコンストラクタのコピーも移動も呼び出されず、この例で実際に何が起こるのですか?

答えて

3

Copy elisionのため、適切なコンストラクタが呼び出されてオブジェクトを直接構築します。コピー/移動コンストラクタは省略されます。そして、C++ 17以降、この動作は保証されています。次の状況下では

、コンパイラは、クラスの 著作とmove-コンストラクタを省略することが必要とされているコピー/移動 コンストラクタとデストラクタが観測副作用を持っている場合でも、オブジェクト:

  • イニシャライザの式がprvalueで、ソースタイプのcv非正規バージョンが宛先クラスの クラスと同じクラスである場合、初期化式は 宛先オブジェクトの初期化に使用されます。

    T x = T(T(T())); // only one call to default constructor of T, to initialize x