"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 > Você pode atribuir referências de tipo de classe a Rvalue? Um paradoxo explicado.

Você pode atribuir referências de tipo de classe a Rvalue? Um paradoxo explicado.

Publicado em 2024-11-08
Navegar:110

 Can You Assign to Rvalue References of Class Type?  A Paradox Explained.

Atribuindo referências de tipo de classe a Rvalue: um paradoxo resolvido

No reino de C , a distinção entre lvalues ​​e rvalues ​​é fundamental. Lvalues ​​representam objetos com locais de memória que podem ser modificados, enquanto rvalues ​​incorporam objetos temporários ou constantes que não podem. No entanto, um trecho de código intrigante levanta questões sobre essa divisão fundamental:

class Y {
public:
    explicit Y(size_t num = 0) {}
};

int main() {
    Y(1) = Y(0); // Here lies the enigma!
    return 0;
}

Por que esse código é compilado? O rvalue retornado pelo construtor não é efêmero e, portanto, impróprio para atribuição?

A chave para entender esse paradoxo está no operador de atribuição implícito em C . Quando o operador de atribuição não é definido explicitamente para uma classe, o compilador sintetiza um operador de atribuição padrão. Crucialmente, este operador sintetizado pode ser aplicável a rvalues ​​em alguns casos.

É aqui que a palavra-chave explícita desempenha um papel. No exemplo dado, a classe Y não declara um operador de atribuição, então o compilador gera um. A palavra-chave explícita evita conversões implícitas de rvalores, mas não impede que o operador de atribuição sintetizado seja aplicável a rvalores.

Assim, em nosso código, o operador de atribuição sintetizado:

Y& Y::operator=(Y const&);

ou

Y& Y::operator=(Y&);

pode ser invocado com o rvalue Y(1) no lado esquerdo. Isso permite que a atribuição prossiga, mesmo que Y(1) seja um rvalue.

Para evitar a atribuição a objetos temporários, pode-se declarar explicitamente o operador de atribuição com um qualificador de referência (&):

class Y {
public:
    explicit Y(std::size_t num = 0);
    Y& operator=(Y const&) & = default;
};

Nesse caso, o operador de atribuição não será sintetizado e a tentativa de atribuir a um rvalue resultará em um erro de compilação.

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