"Si un trabajador quiere hacer bien su trabajo, primero debe afilar sus herramientas." - Confucio, "Las Analectas de Confucio. Lu Linggong"
Página delantera > Programación > ¿Cómo maneja std::move() los valores L en C++?

¿Cómo maneja std::move() los valores L en C++?

Publicado el 2024-11-13
Navegar:284

How Does std::move() Handle Lvalues in C  ?

¿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':

template 
typename 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::type&& move(Object&& arg)
{ return static_cast::type&&>(arg); }

Dado que remove_reference convierte Objeto en Objeto, terminamos con:

Object&& move(Object&& arg) { return static_cast(arg); }

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::type&& move(Object& && arg)
{ return static_cast::type&&>(arg); }

Nuevamente, remove_reference convierte Object& en Object, lo que da como resultado:

Object&& move(Object& && arg) { return static_cast(arg); }

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:

  • Objeto & & = Objeto &
  • Objeto & & && = Objeto &
  • Objeto & && & = Objeto &
  • Objeto & && & && = Objeto & &&

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(arg); }

En esencia, std::move() convierte el argumento lvalue en una referencia rvalue, lo que permite un reenvío perfecto independientemente del tipo de entrada.

Último tutorial Más>

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