2010-12-28 19 views
11

Necesito escribir una clase cuyo constructor toma una referencia constante a un objeto y lo almacena localmente.C++: referencia de referencia no temporal

Para evitar los errores más comunes que puedo prever, me gustaría aceptar solamente referencias a no temporales (es decir, referencias a lvalues).

¿Cómo puedo escribir una función que tenga referencias constantes solo para no temporales?


Por supuesto, incluso un no-temporal podría salir del alcance y de este modo romper mi comportamiento de la clase, pero creo que al no permitir referencias temporales Voy a evitar la mayoría de los errores.

+0

¿Por qué crees que evitas la mayoría de los errores como este? –

+0

Bueno, el objeto cuya referencia necesito pasar no requiere ser utilizado después de que haya sido instanciado (es decir: simplemente instancia el objeto y lo paso, por lo tanto, debido a mi estilo de código no lo crearía en la pila). Si me olvido de que el constructor de otra clase necesita un valor _permanente_, viendo el rechazo temporal (es decir, error de tiempo compilado) que me recordará, espero. – peoro

Respuesta

18

Si se va a almacenar una referencia y la necesidad de utilizarlo después del constructor ha completado, es probablemente el mejor para el constructor de tomar un puntero:

struct C { 
    C(const X* p) : p_(p) { } 

    const X* p_; 
}; 

De esta manera, es casi seguro que usted no tendrá un puntero a un temporal (a menos que X haga algo realmente tonto, como sobrecargar el & único para devolver this).

Si el constructor toma un puntero, también es más claro para los usuarios de la clase que necesitan prestar atención a la duración del objeto X que pasan al constructor.

+4

¡Solución limpia e inteligente! –

+1

Sí, ¡acuerdo, solución limpia e inteligente! También afirmaré que 'p' no es nulo y lo almacenaré como referencia. – peoro

+0

De acuerdo, ¡OP debería aprender que los punteros son mejores! Solo use referencias cuando sea absolutamente necesario (por ejemplo, en constructores de copia). – Yttrill

Cuestiones relacionadas