0Pricing
C++ Academy · Aula

Lvalue versus rvalue: a distinção

Raciocine sobre categorias de valores: lvalues, prvalues e xvalues

Lvalue versus rvalue: a distinção é uma aula grátis de C++ Academy no CoddyKit. Esta é a aula 1 de 4. Você pode ler a aula completa abaixo gratuitamente — depois pratica ao vivo no navegador com um editor de código integrado e um tutor de IA 24/7. Faz parte do caminho de aprendizado de C++ Academy, e seu progresso é sincronizado entre a web e o app CoddyKit. O curso de C++ Academy inclui 4 aulas no total.

Dois mundos: lvalue e rvalue

Toda expressão em C++ é um lvalue (uma coisa com nome e endereço) ou um rvalue (um temporário sem nome).

Lvalues

Um lvalue faz referência a um objeto persistente — é possível obter seu endereço com &.

int x = 42;           // x is an lvalue
int* p = &x;          // taking the address of an lvalue

int& r = x;           // r is an lvalue reference

Rvalues

Um rvalue é um temporário — literais, valores retornados por funções e expressões como a + b. Não é possível obter seu endereço.

int a = 5, b = 3;
int c = a + b;        // (a + b) is an rvalue
// int* p = &(a + b); // ERROR: cannot take address of an rvalue

Por que a distinção é importante

Um rvalue está prestes a ser destruído. Podemos apropriar-nos de seus recursos com segurança em vez de copiá-los — essa é a base da semântica de movimentação.

Três categorias desde o C++11

O C++ moderno refina o modelo:

  • lvalue — tem nome e identidade
  • prvalue (rvalue puro) — temporário puro (um literal, retorno por valor)
  • xvalue (expirante) — está prestes a ser destruído (o resultado de std::move)

Referências lvalue e rvalue

Uma referência lvalue usa &; uma referência rvalue usa &&.

int x = 10;
int&  lr = x;        // lvalue reference
int&& rr = 42;       // rvalue reference, binds to literal

Regras de vinculação

Compatibilidade de tipos:

  • uma referência lvalue (T&) vincula-se a lvalues
  • uma referência lvalue const (const T&) vincula-se a ambos
  • uma referência rvalue (T&&) vincula-se somente a rvalues (e xvalues)

Verificando com decltype

É possível perguntar ao compilador qual é a categoria de uma expressão usando decltype nela.

int x = 10;
static_assert(std::is_lvalue_reference<decltype((x))>::value);
// the extra parentheses make decltype yield the lvalue ref

Por que o C++11 adicionou referências rvalue

Para habilitar a semântica de movimentação: um construtor que recebe T&& pode assumir a propriedade dos dados internos de um temporário, evitando uma cópia profunda.

Erro comum: uma referência rvalue nomeada é um lvalue

Uma variável de referência rvalue, depois de declarada, tem um nome — o que a torna um lvalue. Para passá-la adiante como rvalue, use std::move.

void f(std::string&& s) {
    // s here is an lvalue!
    process(std::move(s));   // now it is an rvalue again
}

Prévia do encaminhamento perfeito

Modelos que recebem T&& deduzem uma referência lvalue ou rvalue. Combinados com std::forward, podem preservar a categoria de valor — isso será abordado em detalhes mais adiante.

Verificação rápida

Qual destas expressões é um rvalue?

Recapitulação

Um lvalue tem nome e endereço; um rvalue é um temporário. T& vincula-se a lvalues, e T&& vincula-se a rvalues. Essa distinção habilita a semântica de movimentação — evitando cópias desnecessárias de temporários.

Perguntas Frequentes

A aula “Lvalue versus rvalue: a distinção” é grátis?

Sim — o texto completo de “Lvalue versus rvalue: a distinção” é grátis para ler aqui na web. Para praticá-la interativamente (um editor de código integrado e um tutor de IA 24/7) e desbloquear o restante do curso de C++ Academy, atualize para CoddyKit PRO. O curso de C++ Academy inclui 4 aulas no total.

O que vou aprender em “Lvalue versus rvalue: a distinção”?

Raciocine sobre categorias de valores: lvalues, prvalues e xvalues Você pratica C++ Academy com código prático que executa diretamente no navegador, e um tutor de IA 24/7 responde suas dúvidas enquanto trabalha na aula.

Preciso ter experiência prévia para começar C++ Academy?

Nenhuma experiência prévia é necessária. C++ Academy no CoddyKit é estruturado para alunos iniciantes até avançados, então você pode começar aqui ou desde o início e aprender no seu ritmo. Esta é a aula 1 de 4.

Quanto tempo leva a aula “Lvalue versus rvalue: a distinção”?

A maioria das aulas CoddyKit leva cerca de 5–10 minutos. Cada uma é compacta e interativa, então você faz progresso constante e retoma exatamente de onde parou entre web e app.

Posso escrever e executar código nesta aula de C++ Academy?

Sim. Cada aula de C++ Academy inclui um editor de código integrado, então você escreve e executa código real direto no navegador e recebe feedback de IA instantaneamente — nenhuma configuração local necessária.

Todas as aulas deste curso

  1. Lvalue versus rvalue: a distinção
  2. Referências rvalue e a sintaxe &&
  3. std::move e std::forward
  4. Construtores de movimento e atribuição por movimento
← Voltar para C++ Academy