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 referenceRvalues
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 rvaluePor 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 literalRegras 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 refPor 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
- Lvalue versus rvalue: a distinção
- Referências rvalue e a sintaxe &&
- std::move e std::forward
- Construtores de movimento e atribuição por movimento