繁体   English   中英

为什么这个C ++ 0x代码不会调用移动构造函数?

[英]Why doesn't this C++0x code call the move constructor?

出于某种原因,以下代码从不调用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;
};

您没有使用移动构造函数。 我认为交换是这样实现的

Event a;
Event b;

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

您希望使用移动赋值运算符,该运算符在代码中不存在,因此它将回退到复制赋值运算符。

您的代码有两个可能的位置,可以指望移动构造函数被调用(但它没有):

1)调用std :: move
2)在任职期间。

关于1),std :: move执行一个简单的转换 - 它不会从副本创建一个对象 - 如果它确实,那么移动构造函数可能会被它调用,但是因为它执行了一个简单的右值转换,所以它不会被调用。 std :: move的定义类似于static_cast<Event&&>(temp)

关于2),初始化和赋值是两个完全不同的操作(即使某些形式的初始化使用'='符号)。 您的代码执行赋值,因此使用声明为接受const左值引用的默认赋值运算符。 由于您永远不会使用另一个事件对象初始化一个事件对象,因此您不会看到您的移动构造函数被调用。 如果你声明了一个移动赋值运算符: Event& operator=(Event&& other) ,那么你当前的代码会调用它,或者如果你写了: Event a; Event tmp = move(a); Event a; Event tmp = move(a); 你的移动构造函数,如所写的,将被调用。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM