出于某种原因,下面的代码永远不会调用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)调用的std ::移动,点击     2)分配期间。

关于1),性病::移动做了简单的铸件 - 它不会从副本创建一个对象 - 如果它没有那么转移构造函数可以通过它被调用,但由于它的简单右值施放它不”吨得到调用。的标准::动议定义类似于static_cast<Event&&>(temp)

关于2),初始化和分配是两个完全不同的操作(即使一些形式的初始化用“=”符号)。您的代码不会分配,因此使用该声明为接受一个const左值引用的默认赋值运算符。因为你永远不会初始化一个又一个事件对象,你不会看到你的举动构造被调用。如果你宣称此举赋值运算符: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);

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

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top