Перемещение семантики std:: move
Я не очень хорошо понимаю функцию std::move
template <class T>
typename remove_reference<T>::type&&
move(T&& a)
{
return a;
}
почему remove_reference
?
может ли кто-нибудь дать мне простое объяснение?
Ответы
Ответ 1
Подумайте, что произойдет, если T
является ссылкой на lvalue, например MyClass &
. В этом случае T &&
станет MyClass & &&
, и из-за правил сбрасывания ссылок это снова будет преобразовано в MyClass &
. Для достижения правильного результата typename remove_reference<MyClass&>::type&&
сначала удаляет любые ссылочные украшения из типа, поэтому MyClass &
отображается на MyClass
, а затем к нему применяется ссылка rvalue, давая MyClass &&
.
Ответ 2
Поскольку ссылка rvalue на ссылку lvalue будет затухать до ссылки lvalue, а ссылка для сравнения lvalue будет иметь другую семантику из тех, которые вы ожидаете от move
.
Изменить:
Да, почему нисходящий? Проверьте этот код:
template < typename T > T&& func(T&& x) { return x; }
int main()
{
int x;
int &y = func(x);
}
Дополнительная литература: http://www.justsoftwaresolutions.co.uk/cplusplus/rvalue_references_and_perfect_forwarding.html