Durée de vie de temporaires
-
26-09-2019 - |
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() );
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