L'extrait de code en question implique le retour d'un objet std::string temporaire à partir de la fonction foo() et l'appel ultérieur de bar( ) avec le pointeur c_str() du temporaire. Le problème vient de l'hypothèse selon laquelle le temporaire est détruit avant l'exécution de bar().
Cependant, cette hypothèse est incorrecte. Selon le standard du langage C, un objet temporaire existe jusqu'à ce que l'expression complète à laquelle il participe soit terminée. Ce concept est illustré dans la structure de code suivante :
____________________ range of full expression bar( foo().c_str() ); ^^^^^ ^ | | birth funeral
Dans cet exemple, la durée de vie du temporaire renvoyé par foo() s'étend de sa création au point étiqueté « naissance » jusqu'à sa destruction à « funérailles ". Cette destruction se produit après l'appel à bar(), pas avant comme on le pensait initialement.
La règle précise stipule qu'un objet temporaire est détruit lorsque l'expression complète qui contient lexicalement la rvalue (expression de droite) responsable de sa création termine son évaluation. Dans le code donné, cette expression complète est l'appel de fonction lui-même, bar( foo().c_str() ). Par conséquent, l'objet temporaire continue d'exister jusqu'à la fin de cet appel, garantissant que bar() peut accéder à son pointeur c_str().
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!