2008-11-02 7 views

Respuesta

20

NO es seguro ampliar el alcance por referencia. Los objetos en C++ no se cuentan como referencia cuando obj1 sale del ámbito de aplicación, se eliminarán. Referir al resultado de badIdea() solo te meterá en problemas

+0

La pregunta era sobre C++ y el enlace de referencia. El recuento de referencias no entra en él. Agregué una respuesta mía, pero brevemente * puede * ampliar el alcance de un objeto por enlace de referencia, pero debe tener cuidado en su diseño. No lo hagas si no lo entiendes. –

+0

Creo que se refirió al recuento de referencias ya que es así como * podría * devolver una referencia sin que el objeto local salga del alcance en los lenguajes que admiten recuento de referencias (C++ no es uno de ellos, por supuesto). –

+0

Puedo ver cómo el término "recuento de referencias" enturbia los problemas, estaba tratando de insinuar mecanismos que otros lenguajes tienen que podrían mantener vivos los objetos asignados, tal vez no es una buena idea –

0

Por favor, aclarar lo que usted quiere decir.

Asumiendo que tienen la intención de hacer esto:

int * p = NULL; 
{ 
    int y = 22; 
    p = &y; 
} 
*p = 77; // BOOM! 

Pues no, de ninguna manera, el alcance no llega extendieron por tener una referencia.

Es posible que desee buscar punteros inteligentes, p. de las bibliotecas de impulso: clickety

+0

Quise referirme a referencias, no a punteros –

+1

las referencias actúan igual que los punteros, solo que no pueden volverse a unir – peterchen

14

El único lugar en el que está bien extender un alcance con una referencia es con una referencia const en namespace o ámbito de función (no con miembros de la clase).

const int & cir = 1+1; // OK to use cir = 2 after this line 

Este truco se utiliza en Andrei Alexandrescu's muy fresco scope guard con el fin de capturar una referencia a una clase const base de la protección ámbito concreto.

+0

Tenga en cuenta que esto es solo "ampliar el alcance" en el darse cuenta de que el "alcance" generalmente muy estrecho de un temporal se extiende al alcance principal, que es bastante diferente de lo que el OP estaba pidiendo. Felicitaciones por mencionar un aspecto poco conocido de C++ al que mucha gente se confunde al principio. – philsquared

Cuestiones relacionadas