Na linguagem de programação C, Rvalues (valores à direita) não podem ser usados como Lvalues (valores à esquerda). No entanto, existem exceções a esta regra, conforme ilustrado pelo seguinte código:
class Y {
public:
explicit Y(size_t num = 0) {}
};
int main() {
Y(1) = Y(0); // WHAT?!?
return 0;
}
surpreendentemente, esse código compila com sucesso, mesmo que o objeto retornado pelo construtor y (1) seja um rvalue. Este artigo explora as razões por trás desse comportamento inesperado. Para classes que não definem explicitamente um operador de atribuição, o compilador gera um operador de atribuição padrão. Esse operador padrão é uma função de membro que requer uma referência a um objeto da mesma classe que seu parâmetro. Isso significa que ele pode ser aplicado a LValues (objetos referenciados) e rvalues (objetos não referenciados). Esse objeto temporário é destruído automaticamente no final da declaração em que foi criado. No entanto, no caso em que o construtor retorna um valor do tipo de classe, o operador de atribuição sintetizado pode prolongar a vida útil do objeto temporário. é o açúcar sintático para o seguinte código:
Como estabelecemos, o operador de atribuição sintetizado = para a classe y é uma função não-Contrista, o que pode ser aplicado a um Rvalue. Portanto, o compilador pode interpretar a declaração de atribuição como uma atribuição ao objeto temporário criado pelo construtor y (1).
Conclusão
Y& Y::operator=(const Y& other);
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