Const référence en tant que membre de la classe
Même si le sujet a été discuté de nombreuses fois ici, je ne peux pas trouver une explication concluante quant à mon cas particulier. Va const
prolonger la durée de vie de la RefTest
temporaire? Est l'exemple ci-dessous légal?
#include <iostream>
class RefTest
{
public:
RefTest(const std::string &input) : str(input) {}
~RefTest () {std::cout << "RefTest" << std::endl;}
private:
std::string str;
};
class Child
{
public:
Child (const RefTest &ref) : ref_m(ref) {}
~Child () {std::cout << "Test" << std::endl;}
private:
const RefTest &ref_m;
};
class Test
{
public:
Test () : child(RefTest("child")) {}//Will the temporary get destroyed here?
~Test () {std::cout << "Test" << std::endl;}
private:
const Child child;
};
int main ()
{
Test test;
}
Cette dernière ligne n'est pas la création d'un objet. C'est la déclaration d'une fonction. Voir en.wikipedia.org/wiki/Most_vexing_parse.
Ah, zut. J'avais peur que l'exemple est stupide 🙁 Merci de voir mes mises à jour, qui devrait être un peu plus près de ma situation de vie réelle. Cette fois, je ne pense pas qu'il devrait y avoir quelque délicate à analyser les problèmes.
qui
double possible de Ne const référence prolonger la durée de vie d'un temporaire?
Oui, Haroogan déjà lié. Merci.
Ah, zut. J'avais peur que l'exemple est stupide 🙁 Merci de voir mes mises à jour, qui devrait être un peu plus près de ma situation de vie réelle. Cette fois, je ne pense pas qu'il devrait y avoir quelque délicate à analyser les problèmes.
qui
test2
? J'ai dû réécrire mon premier exemple, parce que je n'ai pas mis assez de la pensée en elle.double possible de Ne const référence prolonger la durée de vie d'un temporaire?
Oui, Haroogan déjà lié. Merci.
OriginalL'auteur Mihai Todor | 2013-03-20
Vous devez vous connecter pour publier un commentaire.
La référence n' pas prolonger la durée de vie. Le code est légal, mais seulement parce que vous n'avez jamais accès
ref_m
après le constructeur se termine.Temporaire est lié au paramètre de constructeur,
ref
. Liaison à une autre référence plus tard,ref_m
, de ne pas prolonger la durée de vie. Si c'était le cas, vous auriez un objet sur la pile, ce qui a pour persister aussi longtemps que le membre de référence, c'est lié à ce qui pourrait être alloué sur le tas, de sorte que le compilateur serait incapable de se détendre de la pile lorsque le constructeur retourne.Il serait agréable de recevoir un avertissement, mais les compilateurs ne sont pas parfait et certaines choses sont difficiles à mettre en garde. Le temporaire est créé dans un contexte différent de l'endroit où il est lié à une référence, de sorte que le compilateur ne peut dire il y a un problème avec inlinging allumé, ou quelques petits malins de l'analyse statique.
Même si vous créez un temporaire de l'enfant du constructeur par exemple
ref_m(RefTest(""))
il n'y aura pas de prolonger la vie au-delà de la fin du constructeur, pour la même raison que le temporaire est dans le constructeur du bloc de pile et doit être détruit lorsque cette fonction retourne. La norme dit explicitement: "Une temporaire lié à un membre de référence dans un constructeur ctor-initialiseur (12.6.2) persiste jusqu'à ce que le constructeur sort." 12.2 [classe.temporaire]En effet. Ensuite, la plupart des réponses que j'ai vu ici lié à mes question sont trompeuses. J'étais sous l'impression que si je assigner temporairement à un const de référence, l'objet sera détruit qu'après la référence est hors de portée, et non temporaire.
OriginalL'auteur Jonathan Wakely
La C++ standard états:
NOTE: Et en plus, c'est en double (Un, Deux), vous devez chercher mieux, la prochaine fois... 🙂
Merci pour les références dans l'édition. Il y a trop de questions ici sur ce sujet et maintenant je peux comprendre pourquoi... la Plupart d'entre eux m'a donné l'impression que l'assignation temporaire à un const référence vous permettra de prolonger sa durée de vie jusqu'à ce que la référence est hors de portée.
OriginalL'auteur Alexander Shukaev