2012-01-05 13 views
4

以下のコードでは、関数mainのオブジェクトAにrvalueをどのように割り当てるのですか?移動コンストラクタを呼び出すにはどうすればよいですか?

#include <iostream> 

using namespace std; 

class A 
{ 
    public: 
     int* x; 
     A(int arg) : x(new int(arg)) { cout << "ctor" << endl;} 
     A(const A& RVal) { 
      x = new int(*RVal.x); 
      cout << "copy ctor" << endl; 
     } 
     A(A&& RVal) { 
      this->x = new int(*RVal.x); 
      cout << "move ctor" << endl; 
     } 
     ~A() 
     { 
      delete x; 
     } 
}; 

int main() 
{ 
    A a(8); 
    A b = a; 
    A&& c = A(4); // it does not call move ctor? why? 
    cin.ignore(); 
    return 0; 
} 

ありがとう。

+2

がhttp://stackoverflow.com/questions/3413470/what-is-stdmove – slaphappy

+0

ああそのためのおかげで、今読んを参照してください:あなたは、コンストラクタを使用する必要があります – codekiddy

+0

D initリストは3つのコンストラクタすべてに含まれます。 –

答えて

7

名前付きインスタンスはすべてl-valueです。移動のコンストラクタを持つコードの

例:

void foo(A&& value) 
{ 
    A b(std::move(value)); //move ctr 
} 

int main() 
{ 
    A c(5); // ctor 
    A cc(std::move(c)); // move ctor 
    foo(A(4)); 
} 
+0

A c(A(4));移動ctorを呼び出さない、どうしてですか?それはコピーのctorを呼び出します。どうして?レスポンスありがとう! – codekiddy

+0

@codekiddy:投稿を修正しました。 – alexm

+0

これはコンストラクタをここで呼び出します:http://ideone.com/2Arx3(コンパイラはコンストラクタの呼び出しを冗長にすることで自由にコピーまたは移動できます) – visitor

関連する問題