Семантика перемещения не возвращает «поддельную» копию.Вместо этого в операции копирования он дает разрешению копирующему лицу удалить оригинальную копию.
Может быть полезным мотивирующий пример:
std::vector<int> bigData;
// fill bigData
std::vector<std::vector<int> > listOfData;
listOfData.push_back(std::move(bigData));
// after this point, the contents of bigData are unspecified (however accessing it is _not_ undefined behavior)
Без семантики перемещения вам нужно будет копироватьbigData
, чтобы вставить его в listOfData, или вручную переворачивать с swap()
в новый пустой вектор, который находится в listOfData.Но с семантикой перемещения, rvalue-reference-constructor (он же конструктор перемещения) std::vector
, вызываемый push_back
при копировании в новые данные, имеет разрешение на удаление старого содержимого bigData
- таким образом, это разрешенонапример, украсть внутренний указатель bigData
и сбросить bigData
на пустой вектор.
Семантика перемещения обычно быстрее, чем семантика COW, так как им не нужно поддерживать счетчик ссылок для общего доступа, читатьтолько данные.Однако они более ограничены - вы не можете создать несколько псевдонимов с подсчетом ссылок для своих данных с помощью семантики перемещения, вы можете просто и просто перемещать данные между контейнерами.
Также обратите внимание, что обе последние версии GCCи Microsoft Visual C ++ поддерживают rvalue ссылки и семантику перемещения (GCC с --std=c++0x
), поэтому нет оснований не начинать использовать их сегодня.