2016-05-13 4 views
2

オブジェクトが移動可能であってはならないため、移動割り当てが明示的に削除されるクラスがあります。私はRVOを使用して、このクラスのインスタンスに割り当てた場合でも、コンパイラは私にエラーを与える:コンパイラはコピー代入を使用しません。

main.cpp:12:16: note: candidate function has been explicitly deleted 

もコンパイラは、既存のコピー代入演算子を言及されたが、それを使用していません。

class foo { 
public: 
    foo() {} 
    foo(foo const& r) {} 
    foo(foo&&) = delete; 

    foo const& operator=(foo const& r) { return *this; } 
    foo const& operator=(foo&& r) = delete; 
}; 

int main(int argc, char **argv) { 
    foo bar; 
    bar = foo(); 
    return 0; 
} 

は、私は非常に似ポスト hereが見つかりました:

は、ここに私のコード(または()実行していない例here)です。

私は一時的な使用を避けることができます。なぜ私はすべてのコンパイラ(私はgcc、clangとvs2013でこれをテストした)は、既存のコピーの割り当てを直接呼び出すことができないのだろうか?私が紛失しているものはありますか?

+4

移動代入演算子は良く一致しています。それは削除されたとみなす前に起こります。 – chris

+4

削除された関数は、オーバーロードの解決に関与します。 – 101010

+0

ちょうど移動assingmentを削除しないでくださいすべてが良いでしょう。移動していないものが存在すると、デフォルトが禁止されます。好奇心から外に – SergeyA

答えて

2

(削除された)移動割り当てが過負荷解決に適しているため、コピー割り当ては呼び出されません。

移動割り当てを一切宣言しないでください。コピーの割り当てが選択されます。クラスにはユーザーがコピーコンストラクター、移動コンストラクター、コピー代入演算子を宣言しているため、暗黙的な移動代入演算子は生成されません。それらのいずれも、暗黙の移動代入演算子の生成を防ぎます。


But if i assign to an instance of this class using RVO

ここに関与なしRVOはありません。テンポラリfooを作成し、それを既存の変数にコピーします。コピーの割り当てを省略することはできません。

また、代入演算子から値を返すのは非常に珍しく、非効率的です。

+0

'また、代入演算子から値を返すのは非常に珍しく、非能率的です。本当です。また、erip(「会社はより遅いコードが好きです」)からのコメントもあります。私は私がデザインしていないクラスで働いていて、なぜそれが起こっているのかを疑問に思っています... – user1810087

0

これを行うには、新しい配置を使用することができます。

#include <iostream> 
#include <string> 
#include <new> 

class foo { 
public: 

    foo() {} 
    foo(foo const& r) {} 
    foo(foo&&) = delete; 

    foo const& operator=(foo const& r) { return *this; } 
    foo const& operator=(foo&& r) = delete; 
}; 

int main(int argc,char **argv) 
{ 
    foo bar; 

    //bar = foo(); 
    bar.~foo(); 
    new(&bar) foo(); 

    return 0; 
} 
関連する問題