que no entiendo muy bien la función std::move
movimiento semántica std :: mover
template <class T>
typename remove_reference<T>::type&&
move(T&& a)
{
return a;
}
qué remove_reference
? ¿podría alguien darme una explicación simple?
que no entiendo muy bien la función std::move
movimiento semántica std :: mover
template <class T>
typename remove_reference<T>::type&&
move(T&& a)
{
return a;
}
qué remove_reference
? ¿podría alguien darme una explicación simple?
Piense en lo que sucede si T
es una referencia de valor-I, por ejemplo MyClass &
. En ese caso, T &&
se convertiría en MyClass & &&
, y debido a las reglas de colapso de referencia , esto se transformaría nuevamente en MyClass &
. Para obtener el resultado correcto, typename remove_reference<MyClass&>::type&&
primero elimina las decoraciones de referencia del tipo, por lo que MyClass &
se mapea a MyClass
, y luego se le aplica la referencia r, obteniendo MyClass &&
.
Porque la referencia rvalue a la referencia de lvalue decaería a la referencia lvalue, y la referencia de lvalue retirable tendría una semántica diferente de la que esperaría de move
.
Edit: ¿Eh, por qué el voto a favor? Echa un vistazo a este código:
template < typename T > T&& func(T&& x) { return x; }
int main()
{
int x;
int &y = func(x);
}
Más información: http://www.justsoftwaresolutions.co.uk/cplusplus/rvalue_references_and_perfect_forwarding.html
Sí, eso es exactamente correcto, pero obviamente alguien no está de acuerdo :) –
@Let: ¿Qué quieres decir? No veo ningún voto negativo sobre mi respuesta hasta el momento ... – fredoverflow
Uhm. Escribí lo mismo 10 minutos antes y me votaron negativamente. –