2008-11-02 4 views

Répondre

20

Il n'est PAS sûr d'étendre la portée par référence. Les objets en C++ ne sont pas comptés lorsque obj1 est hors de portée, ils seront supprimés, se référant au résultat de badIdea() ne vous mènera qu'à des problèmes

+0

La question portait sur C++ et la liaison de référence. Le comptage de référence n'y entre pas. J'ai ajouté une réponse de ma part, mais brièvement, vous pouvez * étendre * la portée d'un objet par référence, mais soyez prudent dans votre conception. Ne le faites pas si vous ne le comprenez pas. –

+0

Je pense qu'il a fait référence au comptage des références puisque c'est ainsi que vous * pouvez * renvoyer une référence sans que l'objet local ne soit hors de portée dans les langages supportant le comptage des références (C++ n'étant pas l'un d'eux, bien sûr). –

+0

Je peux voir comment le terme "comptage de référence" embrouille les problèmes, j'essayais de faire allusion à des mécanismes que d'autres langages pourraient garder en vie, peut-être pas une bonne idée –

0

S'il vous plaît préciser ce que vous ne voulez dire.

En supposant que vous l'intention de le faire:

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

Alors non, absolument pas, la portée ne soit pas prolongée en ayant une référence.

Vous pouvez vouloir regarder des pointeurs intelligents, par ex. à partir de bibliothèques boost: clickety

+0

Je voulais dire des références, pas des pointeurs –

+1

Les références agissent de la même manière que les pointeurs, seulement elles ne peuvent pas être reliées – peterchen

14

Le seul endroit où il est correct d'étendre une portée avec une référence est avec une référence const dans namespace ou une étendue de fonction (pas avec les membres de la classe).

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

Cette astuce est utilisée dans Andrei Alexandrescu's très cool scope guard afin de capturer une référence const à une classe de base de la garde de portée concrète.

+0

Notez que cela ne fait que "étendre la portée" sens que la «portée» habituellement très étroite d'un temporaire est étendue à la portée parentale, ce qui est assez différent de ce que demandait le PO. Bravo pour mentionner un aspect peu connu de C++ que beaucoup de gens sont d'abord confus. – philsquared

Questions connexes