"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 > ¿Puede asignar a un rValue de tipo de clase en C ++?

¿Puede asignar a un rValue de tipo de clase en C ++?

Publicado el 2025-03-24
Navegar:832

 Can You Assign to an Rvalue of Class Type in C  ?

a clase tipo rvalues ​​

desbastamiento

en el lenguaje de programación C, rvalues ​​(valores de la mano derecha) típicamente no puede usarse como librales (valores izquierdos). Sin embargo, hay excepciones a esta regla, como se ilustra en el siguiente código:

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

int main() {
    Y(1) = Y(0); // WHAT?!?
    return 0;
}

Sorprendentemente, este código se compila correctamente, aunque el objeto devuelto por el constructor y (1) es un rValue. Este artículo explora las razones detrás de este comportamiento inesperado.

a la asignación de clase RValues ​​

La clave para comprender por qué este código es válido radica en el concepto de funciones de miembros sintetizados. Para las clases que no definen explícitamente un operador de asignación, el compilador genera un operador de asignación predeterminado. Este operador predeterminado es una función miembro que toma una referencia a un objeto de la misma clase que su parámetro.

en el ejemplo anterior, el operador de asignación para la clase Y se sincroniza como sigue:

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

Constructor Devuelve los valores

Cuando un objeto se crea usando un constructor que devuelve un RValue, el compilador genera un objeto temporal en la memoria. Este objeto temporal se destruye automáticamente al final de la declaración en la que se creó. Sin embargo, en el caso en que el constructor devuelve un rValue del tipo de clase, el operador de asignación sintetizado puede extender la vida útil del objeto temporal.

sintaxis de asignación

Declaración de asignación y (1) = y (0); es azúcar sintáctica para el siguiente código:

y (1) .operator = (y (0));
Y(1).operator=(Y(0));

conclusión

contrario a lo que se esperan típicamente, es posible asignar a un rValue del tipo de clase en c porque el compilador sintetiza sintetizar los operadores de asignación no coneutas para las clases sin un rendimiento de la expulga. Estos operadores de asignación sintetizados extienden la vida útil de los objetos temporales creados por los constructores, permitiendo asignaciones a rValues.

Ú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