0Pricing
C++ Academy · Aula

Referências rvalue e a sintaxe &&

Ligue-se a temporários com referências rvalue para transferir recursos com eficiência

Referências rvalue e a sintaxe && é uma aula grátis de C++ Academy no CoddyKit. Esta é a aula 2 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.

A sintaxe &&

Uma referência rvalue é declarada com T&&. Ela se vincula somente a rvalues — temporários prestes a ser destruídos.

int&& ref = 42;          // OK: binds to literal
int x = 10;
// int&& bad = x;        // ERROR: x is an lvalue

Por que usar referências rvalue?

Elas permitem escrever funções que sabem que o argumento está prestes a ser destruído. É possível apropriar-se de seus recursos sem fazer uma cópia.

Sobrecarga de função pelo tipo de referência

É possível sobrecarregar uma função com T& e T&&. O compilador escolhe a opção correta com base na categoria do argumento.

void process(std::string& s) { std::cout << "lvalue\n"; }
void process(std::string&& s) { std::cout << "rvalue\n"; }

std::string s = "hi";
process(s);            // lvalue
process("temp");       // rvalue
process(std::move(s)); // rvalue

Referências rvalue nomeadas tornam-se lvalues

Depois que você dá um nome a uma referência rvalue, esse nome é um lvalue — sua identidade foi fixada. Use std::move para recuperar a categoria rvalue.

void f(std::string&& s) {
    // inside f, the parameter s is an lvalue
    g(s);              // passes s by lvalue
    h(std::move(s));   // passes s as an rvalue
}

std::move é uma conversão

std::move(x) não move nada por si só — é uma conversão de tipo que retorna x como uma referência rvalue. A movimentação efetiva ocorre no construtor que recebe o valor.

// equivalent to
static_cast<std::string&&>(s)

Por que se chama move

O nome reflete o uso típico — passar um objeto cujos conteúdos você pretende apropriar-se —, mas a operação não transfere nada por conta própria.

Referências universais (referências de encaminhamento)

Quando T&& aparece em um modelo com T deduzido, ele é uma referência de encaminhamento — vincula-se tanto a lvalues quanto a rvalues, preservando a categoria.

template <typename T>
void wrapper(T&& arg) {
    process(std::forward<T>(arg));
}

Colapso de referências

Quando referências se acumulam por meio de modelos, a linguagem as reduz:

  • T& & → T&
  • T& && → T&
  • T&& & → T&
  • T&& && → T&&

Quando não usar a movimentação

Para tipos copiáveis trivialmente (int, double, ponteiro), a movimentação é igual à cópia. Chamar std::move não traz benefício e pode confundir os leitores.

Movimentação sem propriedade de recursos

Para tipos sem recursos no heap, o construtor de movimentação é igual ao construtor de cópia. A movimentação só é benéfica para tipos que possuem memória dinâmica.

Armadilha comum: movimentação a partir de const

std::move aplicado a um objeto const não faz nada — o construtor de movimentação não pode ser chamado para um objeto const, pois precisaria modificar a origem.

Verificação rápida

O que std::move(x) realmente faz?

Recapitulação

T&& vincula-se a rvalues. Referências rvalue nomeadas tornam-se lvalues — use std::move para recuperar a categoria rvalue. T&& em um modelo é uma referência de encaminhamento. std::move é uma conversão; não realiza a movimentação por si só.

Perguntas Frequentes

A aula “Referências rvalue e a sintaxe &&” é grátis?

Sim — o texto completo de “Referências rvalue e a sintaxe &&” é 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 “Referências rvalue e a sintaxe &&”?

Ligue-se a temporários com referências rvalue para transferir recursos com eficiência 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 2 de 4.

Quanto tempo leva a aula “Referências rvalue e a sintaxe &&”?

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