2009-06-26 13 views
4

は、次のコードは、Event::Event(Event&& e)なぜこのC++ 0xコードは、移動コンストラクタを呼び出しませんか?何らかの理由で

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; 
}; 

答えて

10

あなたのコードは1が移動コンストラクタが呼び出されることを期待しているために2つの潜在的な場所を持っている(しかし、それはしません):

1)STDを呼び出す::移動
2)中割り当て。

1)については、std :: moveは単純なキャストを行います。コピーからオブジェクトを作成しません。移動コンストラクタが呼び出される可能性がありますが、単純なrvalueキャストそれは呼び出されません。 std :: moveの定義はstatic_cast<Event&&>(temp)に似ています。

2)に関して、初期化と割り当ては、(初期化のいくつかの形式で '='記号を使用していても)全く異なる2つの操作です。あなたのコードは代入を行い、const左辺参照を受け入れるように宣言されているデフォルトの代入演算子を使用します。あるイベントオブジェクトを別のイベントオブジェクトで初期化することは決してないので、ムーブコンストラクタが呼び出されることはありません。移動代入演算子:Event& operator=(Event&& other)を宣言した場合は、現在のコードで呼び出すか、書いた場合:Event a; Event tmp = move(a);作成した移動コンストラクタが呼び出されます。

+0

ありがとうございます! (あなたの名前が最初であったため回答がマークされています) –

11

移動コンストラクタを使用していません。私はスワップはあなたがあなたのコードに存在しない移動代入演算子を、使用したい、この

Event a; 
Event b; 

Event temp(move(a)); // this one wants to use a move constructor 
a = move(b); 
b = move(temp); 

のようなものを実装していると思うので、それがバックコピー代入演算子に落ちます。

関連する問題