почему 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);
}