Notice: This page requires JavaScript to function properly.
Please enable JavaScript in your browser settings or update your browser.
Aprende Referencias Rvalue y Lvalue | Sección
Punteros y Referencias en C++

bookReferencias Rvalue y Lvalue

Desliza para mostrar el menú

Los conceptos lvalue y rvalue están relacionados con la clasificación de expresiones.

  • lvalue o valor izquierdo: expresión que hace referencia a un objeto con una ubicación de memoria identificable. Representa un objeto que puede ser modificado;

  • rvalue o valor derecho: expresión que representa un valor temporal o desechable.

Valores temporales

Un valor temporal es un resultado intermedio y de corta duración creado durante la evaluación de una expresión.

rvalue.h

rvalue.h

copy
12345678
// `(27 + 6 + 3 + 2)` is a tempopary value int sum = 27 + 6 + 3 + 2; // `static_cast<float>(sum)` is a tempopary value float avarage = static_cast<float>(sum) / count; // std::max(7, 9) will return a tempopary value int largest = std::max(7, 9);

Los valores temporales son gestionados automáticamente por el compilador y existen durante la expresión u operación en la que se crean. Después de eso, normalmente se descartan y el resultado se almacena en la variable de destino o se utiliza según sea necesario.

Semántica de movimiento

Una referencia a rvalue se denota mediante el doble ampersand (&&).

La única diferencia entre una referencia a lvalue y una referencia a rvalue es que la rvalue puede vincularse a un objeto temporal, mientras que una referencia a lvalue no puede.

int&& ref_value = 5 * 5;
Note
Nota

El uso de una referencia a rvalue en este contexto puede no ser muy práctico, ya que no hay beneficio en utilizar una referencia a rvalue para un literal simple.

Una combinación de referencias lvalue y rvalue se utiliza para soportar la semántica de movimiento, permitiendo que los recursos se transfieran de un objeto a otro sin copias innecesarias. Observa el siguiente ejemplo:

swap.h

swap.h

copy
123456
std::string swap(std::string& a, std::string& b) { std::string tmp(a); // We have two copies of string `a` a = b; // Now we have two copies of string `b` b = tmp; // And now we have two copies of string `tmp` }

Pero no necesitamos copias de a o b. Simplemente queríamos intercambiarlos. Intentémoslo de nuevo.

main.cpp

main.cpp

copy
1234567891011121314151617181920212223
#include <iostream> void swap(std::string &a, std::string &b) { // Move the content of a into temp std::string temp(std::move(a)); // Move the content of b into a a = std::move(b); // Move the content of temp into b b = std::move(temp); } int main() { std::string a = "Hello\n"; std::string b = "Bye\n"; swap(a, b); std::cout << a << b; }

std::move(): transforma un lvalue en una referencia rvalue, permitiendo la semántica de movimiento y la transferencia de propiedad sin copia.

question mark

¿Qué es un lvalue?

Selecciona la respuesta correcta

¿Todo estuvo claro?

¿Cómo podemos mejorarlo?

¡Gracias por tus comentarios!

Sección 1. Capítulo 10

Pregunte a AI

expand

Pregunte a AI

ChatGPT

Pregunte lo que quiera o pruebe una de las preguntas sugeridas para comenzar nuestra charla

Sección 1. Capítulo 10
some-alt