¿Qué hace std::move() con los valores l?
std::move() es una poderosa herramienta en C para facilitar reenvío perfecto. Sin embargo, su implementación puede sorprender a primera vista. Para aclarar cómo std::move() logra esto, profundicemos en las complejidades de su implementación.
Comprender la función 'Mover'
Comenzaremos con la versión simplificada de la plantilla de función 'mover':
templatetypename remove_reference ::type&& move(T&& arg) { return static_cast ::type&&>(arg); }
Caso 1: Pasar un Rvalue
Cuando se llama a std::move() con un rvalue (un objeto temporal o una expresión que se evalúa como un rvalue) , se crea una instancia de la plantilla de movimiento de la siguiente manera:
// move with [T = Object]: remove_reference
Dado que remove_reference
Object&& move(Object&& arg) { return static_cast
Como se anticipó, la función simplemente convierte su argumento rvalue a una referencia rvalue.
Caso 2: Pasar un valor L
Ahora, lo interesante El caso surge cuando se invoca std::move() con un valor l (una variable con nombre o una expresión que se evalúa como un valor l).
Object a; // a is lvalue Object b = std::move(a);
Esta vez, la plantilla de movimiento crea una instancia para:
// move with [T = Object&] remove_reference
Nuevamente, remove_reference
Object&& move(Object& && arg) { return static_cast
A primera vista, esto parece contradictorio ya que hemos pasado un valor l. Sin embargo, C 11 introduce el concepto de colapso de referencia, que modifica la interpretación de la sintaxis de referencia:
Bajo estas reglas, Object& && se comporta efectivamente como Object&, una referencia de valor l ordinaria que puede vincularse a valores l.
Por lo tanto, la forma final de la función se convierte en:
Object&& move(Object& arg) { return static_cast
En esencia, std::move() convierte el argumento lvalue en una referencia rvalue, lo que permite un reenvío perfecto independientemente del tipo de entrada.
Descargo de responsabilidad: Todos los recursos proporcionados provienen en parte de Internet. Si existe alguna infracción de sus derechos de autor u otros derechos e intereses, explique los motivos detallados y proporcione pruebas de los derechos de autor o derechos e intereses y luego envíelos al correo electrónico: [email protected]. Lo manejaremos por usted lo antes posible.
Copyright© 2022 湘ICP备2022001581号-3