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
std::vector
templatevoid perfectSet(T&& t) { set(std::forward (t)); }
perfectSet(makeAndFillVector()); // referência de valor passada para set
std::vectorConclusãov; perfectSet(v); // lvalue reference passed to set
perfectSet(makeAndFillVector()); // rvalue reference passed to set
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