1> Могу ли я связать lvalue напрямую со ссылкой на rvalue?
Не без явного приведения (например: std::move
).
2> Что происходит с объектом, который является std :: move ()?
Ничего, пока он на самом деле не перемещен.Все, что std::move
делает - возвращает ссылку на r-значение того, что вы ему дали.Фактическое перемещение происходит в конструкторе перемещения / назначении рассматриваемого типа.
3> В чем разница между std :: move и std :: forward?
std::move
для перемещения;std::forward
для пересылки.Это звучит беспечно, но это идея.Если вы собираетесь перемещать объект, используйте std::move
.Если вы намерены переадресовать объект, вы используете std::forward
.
Пересылка использует специализированную семантику, которая разрешает преобразования между типами ссылок, так что природа ссылок сохраняется между вызовами.Специфика всего этого очень ... техническая.
std::move
всегда возвращает &&.Если вы дадите ему ссылку на l-значение, она вернет ссылку на r-значение.Если вы зададите ему тип значения, он вернет ссылку на это значение.И т. Д.
std::forward
не не всегда возвращает &&.Синтаксически, std::forward
просто делает static_cast<T&&>
.Однако из-за специального синтаксиса приведения к типам && это приведение не всегда возвращает &&.Да, это странно, но это решает проблему пересылки, поэтому никому нет до этого дела.Вот почему он содержится в std::forward
, вместо того, чтобы явно делать static_cast
самостоятельно.