Question

Le code suivant fonctionne très bien, mais pourquoi est-ce bon code? Pourquoi le « c_str () » pointeur du temporaire retourné par foo () valide? Je pensais que cela est déjà détruit temporaire lorsque la barre () est entrée - mais il ne semble pas être comme ça. Alors, maintenant, je suppose que le temporaire retourné par foo () sera détruite après l'appel à un bar () - Est-ce exact? Et pourquoi?

std::string foo() {
  std::string out = something...;
  return out;
}

void bar( const char* ccp ) {
  // do something with the string..
}

bar( foo().c_str() );
Était-ce utile?

La solution

  

12.2 / 3 $ « objets temporaires sont   détruit comme la dernière étape   l'évaluation de la pleine expression (1.9)   que (lexicalement) contient le point   où ils ont été créés. C'est vrai   même si cette évaluation se termine   lancer une exception. "

La durée de vie du temporaire renvoyé par foo () se prolonge jusqu'à la fin de la pleine expression où il est créé à-dire jusqu'à la fin de « bar » l'appel de fonction.

EDIT 2:

  

$ 1,9 / 12- « A la pleine expression est un   expression qui n'est pas une sous-expression   d'une autre expression. Si une langue   construire est défini pour produire un   appel implicite d'une fonction, une utilisation de   la construction de la langue est considérée comme   être une expression aux fins   de cette définition. "

Autres conseils

Un objet temporaire est détruit lorsque la pleine expression qui contient le lexicalement rvalue dont l'évaluation a créé cet objet temporaire est complètement évaluée. Laissez-moi vous donner l'art ASCII:

____________________   full-expression ranges from 'b' to last ')'
bar( foo().c_str() );
     ^^^^^          ^
       |            |
     birth       funeral
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top