2016-11-02 6 views
1

私のコードはなぜコンパイラは戻り値を移動する代わりにコピーしようとしていますか?

// definition of class 'Foo' 
class Foo 
{ 
    private: 
    vector<Bar> v; 
    public: 
    ... 
    Foo(Foo&&) = default; // move constructor 
}; 

// definition of function 'f' 
Foo f() 
{ 
    Foo x; 
    DoStuff(x); 
    return x; 
} 

// Somewhere in main 
result = f(); // I am aiming to move 'x' to 'result' 

私は

EAL_1.6.cpp:314:13: error: object of type 'Foo' cannot be assigned because its copy assignment operator is implicitly deleted 
     x = f(x); 
      ^
EAL_1.6.cpp:232:5: note: copy assignment operator is implicitly deleted because 'Foo' has a user-declared move constructor 
    Foo(Foo&&) = default; 
    ^

を受けるコンパイルしようとすると私は

return move(x); 

を試すように誘惑されたが、応じ巧妙な解決策であるようには見えないように見えますthis postに私は、コンストラクタが移動コンストラクタ(this postで説明)を定義するときに削除されることを理解していますが、 'x'を 'result'に移動することをコンパイラに指示する方法を理解できません。

+0

エラーとコードは全く異なる2つのことを示しています。また、「バー」とは何ですか? – 0x499602D2

+1

あなたは 'Foo&operator =(Foo &&)= default;'を持っていますか?それは暗黙的に生成されないためです。 – krzaq

答えて

7

この:

result = f(); // I am aiming to move 'x' to 'result' 

が移動建設の試みではない、それは移動割り当ての試みです。そして、コンパイラとしてあなたを語っている:そのコピー代入演算子は、コピー代入演算子を暗黙的に削除(ムーブ代入演算子があるさ

を暗黙的に削除されますので、タイプFoo

オブジェクトを割り当てることができません単純に完全に存在しない)。おそらく、あなたのタイプが構築可能であれば、それは割り当て可能になります。したがって、次のように追加してください:

Foo& operator=(Foo&&) = default; 
+0

あなたは短い時間で*本当に良い*を持っています。 – 0x499602D2

+0

@ 0x499602D2ありがとう! – Barry

関連する問題