La durée de vie des objets temporaires revisitée
L'extrait de code fourni présente le comportement intrigant des objets temporaires en C . Considérez ce qui suit :
std::string foo() { std::string out = something...; return out; } void bar(const char* ccp) { // Do something with the string... } bar(foo().c_str());
La question se pose : pourquoi le pointeur "c_str()" du temporaire renvoyé par foo() est-il toujours valide ? Le bon sens pourrait suggérer que le temporaire soit détruit avant l'appel de bar(). Cependant, ce n'est pas le cas.
Selon la norme C, la durée de vie d'un objet temporaire s'étend jusqu'à ce que l'évaluation de l'expression complète qui contient lexicalement la valeur r qui l'a créé soit terminée. Cela signifie que dans le code donné, l'objet temporaire renvoyé par foo() restera vivant jusqu'à ce que l'appel à bar() soit terminé.
Pour visualiser ce concept, considérez ce qui suit :
____________________ full-expression ranges from 'b' to last ')' bar(foo().c_str()); ^^^^^ ^ | | birth funeral
L'objet temporaire est créé lorsque foo() est appelé (noté "naissance"). Il reste vivant tout au long de l'évaluation de l'expression complète, qui dans ce cas est l'appel de fonction bar(foo().c_str()). Une fois l'appel de fonction terminé, l'objet temporaire est détruit (noté « funérailles »).
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!