v
является lvalue в операторе возврата (именованные ссылки rvalue являются lvalues, из соображений безопасности), но тип возврата move
является ссылкой rvalue (T
равно int&
, но вы удаляете ссылка, поэтому вы создаете тип int &&
в типе возврата).
Вам нужно сначала static_cast
от v
до remove_reference<T>::type &&
, чтобы создать неназванную ссылку rvalue, когда вы хотите ее вернуть.
Я не уверен, какова ваша цель. Либо вы хотите использовать std::move
(как вы говорите в заголовке), либо вы хотите узнать, как это будет реализовано (как показывает код, который вы показываете). Нет смысла пытаться узнать, как работает std::move
, не зная основных правил C ++. Я рекомендую вам взглянуть на наш C ++ Books List . После того, как вы хорошо разберетесь в C ++, вы можете узнать, как работает std::move
.