30 votes

Durée de vie des temporaires

Le code suivant fonctionne correctement, mais pourquoi ce code est-il correct? Pourquoi le pointeur "c_str ()" du temporaire retourné par foo () est-il valide? Je pensais que ce temporaire est déjà détruit lorsque bar () est entré - mais il ne semble pas être comme ça. Donc, maintenant je suppose que le temporaire retourné par foo () sera détruit après l'appel à bar () - est-ce correct? 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() );
 

55voto

FredOverflow Points 88201

Un objet temporaire est détruit lorsque l'expression complète qui contient lexicalement la valeur r dont l'évaluation a créé cet objet temporaire est complètement évaluée. Permettez-moi de démontrer avec l'art ASCII:

 ____________________   full-expression ranges from 'b' to last ')'
bar( foo().c_str() );
     ^^^^^          ^
       |            |
     birth       funeral
 

38voto

Chubsdad Points 14310

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

La durée de vie de la temporaire retourné par foo() s'étend jusqu'à la fin de la pleine expression où il est créé, c'est à dire jusqu'à la fin de l'appel de la fonction 'bar'.

EDIT 2:

$1.9/12- "Une pleine expression est un expression qui n'est pas une sous-expression d'une autre expression. Si une langue construire est défini de manière à produire un implicite de l'appel d'une fonction, d'une utilisation de la construction du langage est considéré comme être une expression pour l'application de cette définition."

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X