En C++, est-il sûr d'étendre la portée via une référence?En C++, est-il sûr d'étendre la portée via une référence?
Dans le code, ce que je veux dire est:
MyCLass& function badIdea()
{
MyClass obj1;
...
return obj1;
}
En C++, est-il sûr d'étendre la portée via une référence?En C++, est-il sûr d'étendre la portée via une référence?
Dans le code, ce que je veux dire est:
MyCLass& function badIdea()
{
MyClass obj1;
...
return obj1;
}
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
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
Je voulais dire des références, pas des pointeurs –
Les références agissent de la même manière que les pointeurs, seulement elles ne peuvent pas être reliées – peterchen
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.
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
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. –
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). –
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 –