2009-06-26 74 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)調用的std ::移動
2)期間,分配。

關於1),性病::移動做了簡單的鑄件 - 它不會從副本創建一個對象 - 如果它沒有那麼轉移構造函數可以通過它被調用,但由於它的簡單右值投它不會被調用。 std :: move的定義與static_cast<Event&&>(temp)類似。

關於2),初始化和賦值是兩個完全不同的操作(即使某些形式的初始化使用'='符號)。您的代碼不會分配,因此使用聲明爲接受常量左值引用的默認賦值運算符。既然你從不初始化一個事件對象,你不會看到你的移動構造函數被調用。如果你聲明瞭一個移動賦值操作符:Event& operator=(Event&& other),那麼你當前的代碼會調用它,或者如果你寫了:Event a; Event tmp = move(a);你寫的移動構造函數會被調用。

+0

謝謝! (標記爲答案是因爲你的第一個答案) – 2009-06-29 18:25:06

11

您沒有使用移動構造函數。我想交換來實現這樣的

Event a; 
Event b; 

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

你想使用移動賦值運算符,這並不在你的代碼存在,所以它回落到拷貝賦值運算符。

相關問題