Скажем, у меня есть два вектора, и я перехожу один к другому, v1 = std::move(v2)
; будет v2
по-прежнему находиться в пригодном для использования состоянии после этого?
Оставляет ли перемещение объект в пригодном для использования состоянии?
Ответ 1
От n3290, 17.6.5.15 Перемещение из состояния типов библиотек [lib.types.movedfrom]
- Объекты типов, определенные в стандартной библиотеке С++, могут быть перемещены из (12.8). Операции перемещения могут быть явно указаны или неявно сгенерированы. Если не указано иное, такие перемещенные объекты помещаются в действительное, но неопределенное состояние.
Так как состояние действительно, это означает, что вы можете безопасно работать с v2
(например, назначив ему, который вернет его в известное состояние). Так как это не указано, это означает, что вы не можете, например, полагаться на какое-либо конкретное значение для v2.empty()
, пока оно находится в этом состоянии (но вызов его не приведет к сбою программы).
Обратите внимание, что эта аксиома семантики перемещения ( "Перемещено из объектов остается в действительном, но неопределенном состоянии" ) - это то, к чему должен стремиться весь код (в большинстве случаев), а не только компоненты стандартной библиотеки. Подобно семантике конструкторов копий, необходимо сделать копию, но не соблюдаться.
Ответ 2
Нет, он оставлен в неуказанном состоянии.
Выдержка из open-std-org -
.. move() дает своей цели значение своего аргумента, но не обязано сохранять значение своего источника. Таким образом, для вектора move() можно было бы разумно ожидать, что его аргумент станет вектором нулевой емкости, чтобы избежать необходимости копировать все элементы. Другими словами, перемещение является потенциально разрушительным чтением.