2017-11-27 6 views
0

と呼ばれていない、私の環境では移動コンストラクタが呼び出されることはありません:C++移動コンストラクタは、以下の(借り)の例では

#include <iostream> 

class MyClass { 
    public: 
     MyClass() 
     { 
      std::cout << "default constructor\n"; 
     } 
     MyClass(MyClass& a) 
     { 
      std::cout << "copy constructor\n"; 
     } 

     MyClass(MyClass&& b) 
     { 
      std::cout << "move constructor\n"; 
     } 
}; 

void test(MyClass&& temp) 
{ 
    MyClass a(MyClass{}); // calls MOVE constructor as expected 
    MyClass b(temp); // calls COPY constructor... 
} 

int main() 
{ 
    test(MyClass{}); 
    return 0; 
} 

私の出力は次のようになります。 デフォルトコンストラクタ デフォルトコンストラクタ コピーコンストラクタ

私はXcodeのバージョン9.1を使用して、rvalue参照で移動コンストラクタを呼び出すべきではないのですか?私はここで何が欠けていますか?

ジョン。

+0

'MyClass && temp'は実際には' MyClass b(temp); '(これは名前があるので)という名前のポイントの左辺値です。 rvalueコンストラクタを呼び出すには、move(* MyClass b(std :: move(temp));)を実行する必要があります。 –

答えて

0

私はここで何が欠けていますか?

重要な点は、名前を持つものすべてが左辺値であることです。

それは名前の右辺値参照自体は左辺値であるとのtempことを意味します

void test(MyClass&& temp) 

が同様に左辺値です。したがって、移動コンストラクタは呼び出されません。あなたが移動コンストラクタが呼び出されるようにしたい場合は

std::move使用:ところで

void test(MyClass&& temp) 
{ 
    // ... 
    MyClass b(std::move(temp)); // use std::move here 
} 

を、

MyClass(MyClass& a) 
{ 
    std::cout << "copy constructor\n"; 
} 

はコピーコンストラクタではありませんコピーコンストラクタがの形があるので:

MyClass(const MyClass& a) { ... } 
+0

はこのコードを使用しないでください:MyClass a(MyClass {});移動コンストラクタを呼び出す必要がありますか? –

+0

@ JohnGorterそうかもしれませんが、実際にコピーエリシジョンが行われます:http://en.cppreference.com/w/cpp/language/copy_elision –

関連する問題