"Si un trabajador quiere hacer bien su trabajo, primero debe afilar sus herramientas." - Confucio, "Las Analectas de Confucio. Lu Linggong"
Página delantera > Programación > ¿Se pueden asignar referencias de tipo de clase a Rvalue? Una paradoja explicada.

¿Se pueden asignar referencias de tipo de clase a Rvalue? Una paradoja explicada.

Publicado el 2024-11-08
Navegar:972

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

Asignación de referencias Rvalue de tipo de clase: una paradoja resuelta

En el ámbito de C, la distinción entre lvalues ​​y rvalues ​​es primordial. Los valores L representan objetos con ubicaciones de memoria que se pueden modificar, mientras que los valores r representan objetos temporales o constantes que no pueden modificarse. Sin embargo, un fragmento de código intrigante plantea preguntas sobre esta división fundamental:

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

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

¿Por qué se compila este código? ¿No es el valor r devuelto por el constructor efímero y, por lo tanto, no apto para la asignación?

La clave para comprender esta paradoja reside en el operador de asignación implícito en C. Cuando el operador de asignación no está definido explícitamente para una clase, el compilador sintetiza un operador de asignación predeterminado. Fundamentalmente, este operador sintetizado puede ser aplicable a rvalues ​​en algunos casos.

Aquí es donde la palabra clave explícita juega un papel. En el ejemplo dado, la clase Y no declara un operador de asignación, por lo que el compilador genera uno. La palabra clave explícita evita conversiones implícitas de rvalues, pero no impide que el operador de asignación sintetizado sea aplicable a rvalues.

Así, en nuestro código, el operador de asignación sintetizado:

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

o

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

puede invocarse con el rvalue Y (1) en el lado izquierdo. Esto permite que la asignación continúe, aunque Y(1) sea un valor r.

Para evitar la asignación a objetos temporales, se puede declarar explícitamente el operador de asignación con un calificador de referencia (&):

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

En este caso, el operador de asignación no se sintetizará y al intentar asignarlo a un rvalue se producirá un error de compilación.

Último tutorial Más>

Descargo de responsabilidad: Todos los recursos proporcionados provienen en parte de Internet. Si existe alguna infracción de sus derechos de autor u otros derechos e intereses, explique los motivos detallados y proporcione pruebas de los derechos de autor o derechos e intereses y luego envíelos al correo electrónico: [email protected]. Lo manejaremos por usted lo antes posible.

Copyright© 2022 湘ICP备2022001581号-3