Existe una manera correcta de devolver una nueva instancia de objeto por referencia en C ++?

Entonces estaba escribiendo un código y tenía algo como esto:

class Box
{
    private:
    float x, y, w, h;

    public:
    //...
    Rectangle & GetRect( void ) const
    {
        return Rectangle( x, y, w, h );
    }
};

Luego, en algún código:

Rectangle rect = theBox.GetRect();

Lo que funcionó en mi versión de depuración, pero en el lanzamiento hubo "problemas" que devolvieron ese Rectángulo por referencia: básicamente obtuve un rectángulo no inicializado. La clase Rectangle tiene un operador = y un constructor de copia. Sin entender por qué se rompió esto, en realidad estoy más interesado en la forma correcta de devolver un (nuevo) objeto por referenciaa fin de asignando copiando a una variable. ¿Solo estoy siendo tonto? ¿No debería hacerse? Sé que puedo devolver un puntero y luego desreferenciar en la asignación, pero prefiero no hacerlo. Una parte de mí siente que regresar por valor daría como resultado una copia redundante del objeto: ¿el compilador se da cuenta y lo optimiza?

Parece una pregunta trivial. Me siento casi avergonzado de no saber esto después de muchos años de codificación C ++, así que espero que alguien pueda aclarar esto por mí. :)

Respuestas a la pregunta(18)

Su respuesta a la pregunta