"Se um trabalhador quiser fazer bem o seu trabalho, ele deve primeiro afiar suas ferramentas." - Confúcio, "Os Analectos de Confúcio. Lu Linggong"
Primeira página > Programação > Como std::move() trata Lvalues ​​em C++?

Como std::move() trata Lvalues ​​em C++?

Publicado em 13/11/2024
Navegar:365

How Does std::move() Handle Lvalues in C  ?

O que std::move() faz com lvalues?

std::move() é uma ferramenta poderosa em C para facilitar encaminhamento perfeito. No entanto, a sua implementação pode levantar algumas sobrancelhas à primeira vista. Para esclarecer como std::move() consegue isso, vamos nos aprofundar nos meandros de sua implementação.

Compreendendo a função 'Move'

Começaremos com a versão simplificada do modelo de função 'move':

template 
typename remove_reference::type&& move(T&& arg)
{ return static_cast::type&&>(arg); }

Caso 1: Passando um Rvalue

Quando std::move() é chamado com um rvalue (um objeto temporário ou uma expressão que é avaliada como um rvalue) , o modelo de movimentação é instanciado da seguinte forma:

// move with [T = Object]:
remove_reference::type&& move(Object&& arg)
{ return static_cast::type&&>(arg); }

Como remove_reference converte objeto em objeto, terminamos com:

Object&& move(Object&& arg) { return static_cast(arg); }

Como antecipado, a função simplesmente lança seu argumento rvalue para uma referência rvalue.

Caso 2: Passando um Lvalue

Agora, o interessante O caso surge quando std::move() é invocado com um lvalue (uma variável nomeada ou uma expressão que é avaliada como um lvalue).

Object a; // a is lvalue
Object b = std::move(a);

Desta vez, o modelo de movimentação é instanciado para:

// move with [T = Object&]
remove_reference::type&& move(Object& && arg)
{ return static_cast::type&&>(arg); }

Novamente, remove_reference converte Object& em Object, resultando em:

Object&& move(Object& && arg) { return static_cast(arg); }

À primeira vista, isso parece contra-intuitivo, já que passamos um lvalue. No entanto, C 11 introduz o conceito de reference colapso, que modifica a interpretação da sintaxe de referência:

  • Object & & = Object &
  • Object & & && = Objeto &
  • Objeto & && & = Objeto &
  • Objeto & && & && = Objeto & &&

Sob essas regras, Object& && efetivamente se comporta como Object&, uma referência lvalue comum que pode ser vinculada a lvalues.

Portanto, a forma final da função se torna:

Object&& move(Object& arg) { return static_cast(arg); }

Em essência, std::move() converte o argumento lvalue em uma referência rvalue, permitindo o encaminhamento perfeito independentemente do tipo de entrada.

Tutorial mais recente Mais>

Isenção de responsabilidade: Todos os recursos fornecidos são parcialmente provenientes da Internet. Se houver qualquer violação de seus direitos autorais ou outros direitos e interesses, explique os motivos detalhados e forneça prova de direitos autorais ou direitos e interesses e envie-a para o e-mail: [email protected]. Nós cuidaremos disso para você o mais rápido possível.

Copyright© 2022 湘ICP备2022001581号-3