"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::forward garante o encaminhamento perfeito de referências lvalue e rvalue em C++?

Como std::forward garante o encaminhamento perfeito de referências lvalue e rvalue em C++?

Publicado em 19/11/2024
Navegar:509

How does std::forward ensure perfect forwarding of lvalue and rvalue references in C  ?

Como std::forward facilita o encaminhamento perfeito de referências Lvalue e Rvalue

Em C , std::forward desempenha um papel crucial na obtenção encaminhamento perfeito, que garante que os argumentos sejam passados ​​para funções com sua categoria de valor original preservada. Esse comportamento pode ser particularmente confuso ao lidar com referências lvalue e rvalue.

Lvalue vs. Rvalue Distinction

"Se tiver um nome, é um lvalue." Embora esse ditado geralmente seja verdadeiro, ele não explica completamente o comportamento de std::forward ao lidar com thing&& x vs. thing& x.

Lvalue References (thing& x)

Quando um argumento é passado por referência lvalue, ele permanece uma referência lvalue dentro da função. As referências Lvalue são sempre vinculadas a um local de memória nomeado específico. pode ser uma referência de valor ou uma referência de valor convertida. Uma referência de rvalue está vinculada a um objeto temporário ou a um valor que está sendo movido.

Como funciona std::forward

std::forward é definido por um especial tabela de conversão. Seu objetivo principal é converter uma referência de qualquer tipo em uma referência de valor. Esta conversão não altera a categoria de valor do argumento original.

Exemplo: encaminhamento perfeito usando std::forward

Considere uma função de modelo perfectSet que aceita um argumento T&& :

modelo vazio conjunto perfeito(T&& t) { set(std::forward(t)); }Agora, quando perfectSet é chamado com um lvalue, o tipo T na função instanciada é inferido como T&. A conversão std::forward garante que o argumento seja passado para set como uma referência lvalue.

std::vector v; conjunto perfeito(v); // referência de lvalue passada para set

template
void perfectSet(T&& t) {
    set(std::forward(t));
}

perfectSet(makeAndFillVector()); // referência de valor passada para set

std::vector v;
perfectSet(v); // lvalue reference passed to set
Conclusão

perfectSet(makeAndFillVector()); // rvalue reference passed to set
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