2009-06-26 75 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); 

你想使用移动赋值运算符,这并不在你的代码存在,所以它回落到拷贝赋值运算符。

相关问题