Почему этот код C ++ 0x не вызывает конструктор перемещения?

По какой-то причине следующий код никогда не вызываетEvent::Event(Event&& e)

<code>Event a;
Event b;
Event temp;
temp = move(a);
a = move(b);
b = move(temp);
</code>

почему бы и нет?

С помощьюstd::swap называет это один раз.

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

Ответы на вопрос(2)

Решение Вопроса

где можно ожидать вызова конструктора перемещения (но это не так):

1) calling std::move
2) during assignment.

Что касается 1), std :: move выполняет простое приведение - он не создает объект из копии - если он это сделал, то конструктор перемещения может быть вызван им, но, поскольку он выполняет простое приведение типа rvalue, он не вызывается , Определение std :: move похоже наstatic_cast<Event&&>(temp).

Что касается 2), инициализация и присвоение являются двумя совершенно разными операциями (даже при том, что некоторые формы инициализации используют символ «=»). Ваш код выполняет присваивание и, следовательно, использует оператор присваивания по умолчанию, который объявлен для принятия константной ссылки. Поскольку вы никогда не инициализируете один объект события другим, вы не увидите, как будет вызван ваш конструктор перемещения. Если вы объявили оператор присваивания перемещения:Event& operator=(Event&& other), тогда ваш текущий код будет вызывать его или если вы написали:Event a; Event tmp = move(a); Ваш конструктор перемещения, как написано, будет вызван.

 Neil G29 июн. 2009 г., 20:25
Спасибо! (помечен как ответ, потому что ваш был первым)

что своп реализован примерно так

Event a;
Event b;

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

Вы хотите использовать оператор присваивания перемещения, которого нет в вашем коде, поэтому он возвращается к оператору присваивания копии.

Ваш ответ на вопрос