Maison >développement back-end >C++ >Pourquoi `c_str()` d'une chaîne temporaire C reste-t-il valide après l'appel de fonction ?

Pourquoi `c_str()` d'une chaîne temporaire C reste-t-il valide après l'appel de fonction ?

Mary-Kate Olsen
Mary-Kate Olsenoriginal
2024-12-16 18:57:21274parcourir

Why Does a C   Temporary String's `c_str()` Remain Valid After the Function Call?

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!

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn