Технически std::move
не перемещает ничего, просто дает ссылку на значение.Фактическая семантика перемещения чего-либо происходит только потому, что это вызывает разрешение перегрузки для вызова различных функций, поэтому:
std::vector<int> a{1, 2, 3};
std::vector<int> b{std::move(a)};
Это эквивалентно:
std::vector<int> a{1, 2, 3};
std::vector<int> b{static_cast<std::vector<int>&&>(a)};
Опять же, вrvalue ссылка &&
, которая заставляет его "перемещать" вещи, вся семантика перемещения находится в конструкторе std::vector
.Тип int
не имеет специальной семантики перемещения, поэтому он этого не делает.
Это имеет смысл.Для std::vector
перемещение вектора и обнуление оригинала обходится дешевле, чем копирование.Для int
обнуление оригинала на самом деле на дороже , чем просто его копирование - вы все равно должны скопировать значение, так что нет смысла выполнять дополнительную работу по выбрасыванию оригинала.