なぜ、このC ++ 0xのコードでは、移動のコンストラクタを呼び出すことはありませんか?
質問
いくつかの理由について、次のコードは、Event::Event(Event&& e)
Event a;
Event b;
Event temp;
temp = move(a);
a = move(b);
b = move(temp);
なぜない?
std::swap
を使用すると、一度それを呼び出します。
class Event {
public:
Event(): myTime(0.0), myNode(NULL) {}
Event(fpreal t, Node* n);
Event(Event&& other);
Event(Event const& other) = delete;
~Event();
bool operator<(Event const& other) const { return myTime < other.myTime; }
bool operator>(Event const& other) const { return myTime > other.myTime; }
fpreal getTime() const { return myTime; }
void setTime(fpreal time) { myTime = time; }
Node* getNode() const { return myNode; }
private:
fpreal myTime;
Node* myNode;
};
解決
あなたのコードは1が移動コンストラクタが呼び出されることを期待しているために2つの潜在的な場所を持っている(しかし、それはしません):
1)を呼び出すのstd ::移動
2)割り当て中。
)1については、STD ::動きは、単純なキャストません - それはコピーからオブジェクトを作成できません - それは、次に行った場合には移動コンストラクタは、それによって呼び出される可能性がありますが、それは簡単な右辺値をキャストしないので、それはdoesnのをtが呼び出されます。 std ::移動の定義は、static_cast<Event&&>(temp)
。
)2については、初期化および割り当て)は、初期化のいくつかの形態は、「=」記号を使用するにもかかわらず、(2回の全く異なる操作です。あなたのコードが割り当てを行い、そのためのconst左辺値参照を受け入れるように宣言されているデフォルトの代入演算子を使用しています。あなたが別で1つのイベントオブジェクトを初期化することはありませんので、あなたはあなたの移動のコンストラクタが呼び出されます表示されません。あなたが移動代入演算子を宣言した場合:Event& operator=(Event&& other)
は、その後、あなたの現在のコードがそれを呼び出しますかあなたが書いたとします。Event a; Event tmp = move(a);
あなたの移動のコンストラクタは、書かれたとして、呼び出さなるだろう。
他のヒント
あなたは動きのコンストラクタを使用していません。私はスワップは、このような何かを実装していると思います。
Event a;
Event b;
Event temp(move(a)); // this one wants to use a move constructor
a = move(b);
b = move(temp);
あなたはそれが戻ってコピー代入演算子に落ちるので、あなたのコードに存在しない移動代入演算子を使用したいです。