Notice: This page requires JavaScript to function properly.
Please enable JavaScript in your browser settings or update your browser.
Aprenda Referências Rvalue e Lvalue | Seção
Ponteiros e Referências em C++

bookReferências Rvalue e Lvalue

Deslize para mostrar o menu

Os conceitos de lvalue e rvalue estão relacionados à classificação de expressões.

  • lvalue ou valor à esquerda: expressão que se refere a um objeto com localização de memória identificável. Representa um objeto que pode ser modificado;

  • rvalue ou valor à direita: expressão que representa um valor temporário ou descartável.

Valores Temporários

Valor temporário é um resultado intermediário e de curta duração criado durante a avaliação de uma expressão.

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);

Valores temporários são gerenciados automaticamente pelo compilador e existem durante a expressão ou operação em que são criados. Após isso, normalmente são descartados, e o resultado é armazenado na variável de destino ou utilizado conforme necessário.

Semântica de movimento

Uma referência a rvalue é denotada pelo duplo e comercial (&&).

A única diferença entre uma referência a lvalue e a rvalue é que a rvalue pode ser vinculada a um objeto temporário, enquanto uma referência a lvalue não pode.

int&& ref_value = 5 * 5;
Note
Nota

O uso de uma referência a rvalue neste contexto pode não ser muito prático, pois não há benefício em utilizar uma referência a rvalue para um literal simples

Uma combinação de referências lvalue e referências rvalue é utilizada para suportar semântica de movimento, permitindo que recursos sejam transferidos de um objeto para outro sem cópias desnecessárias. Veja o exemplo abaixo:

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` }

Mas não precisamos de cópias de a ou b. Apenas queríamos trocá-los. Vamos tentar novamente.

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 um lvalue em uma referência rvalue, habilitando semântica de movimento e a transferência de propriedade sem cópia.

question mark

O que é um lvalue?

Selecione a resposta correta

Tudo estava claro?

Como podemos melhorá-lo?

Obrigado pelo seu feedback!

Seção 1. Capítulo 10

Pergunte à IA

expand

Pergunte à IA

ChatGPT

Pergunte o que quiser ou experimente uma das perguntas sugeridas para iniciar nosso bate-papo

Seção 1. Capítulo 10
some-alt