Maison  >  Article  >  développement back-end  >  La durée de vie d'une valeur de retour « std::initializer_list » s'étend-elle à la fonction appelante ?

La durée de vie d'une valeur de retour « std::initializer_list » s'étend-elle à la fonction appelante ?

Patricia Arquette
Patricia Arquetteoriginal
2024-10-28 22:44:02997parcourir

Does the Lifetime of a `std::initializer_list` Return Value Extend into the Calling Function?

Durée de vie d'un std::initializer_list Valeur de retour

Question :

Selon la norme C, lorsqu'une fonction renvoie une liste d'initialisation, la durée de vie de son tableau sous-jacent doit-elle s'étendre jusqu'à la fonction appelante ?

Analyse

La norme C stipule que la durée de vie d'un objet std::initializer_list est la même que celle de l'objet qu'il initialise. Lorsqu'une fonction renvoie une liste d'initialisation, elle initialise l'objet de valeur de retour. Cependant, deux instances de la liste d'initialisation sont impliquées : celle dans la fonction et celle dans le code appelant.

L'exemple de la norme suggère que la durée de vie du tableau s'étend à l'objet copié, ce qui impliquerait que le tableau de la valeur de retour devrait également survivre dans la fonction appelante. Cependant, ce n'est pas le cas en pratique.

Réponse :

Actuellement, le comportement de la durée de vie d'une valeur de retour std::initializer_list n'est pas clairement défini dans la norme C. Différents compilateurs l'implémentent différemment :

  • GCC détruit incorrectement le tableau avant de le renvoyer, tout en préservant les listes d'initialiseurs nommés.
  • Clang traite correctement l'exemple du standard, mais ne détruit jamais les objets dans le liste. Cela entraînerait une fuite de mémoire.
  • ICC ne prend pas du tout en charge les listes d'initialisation.

En conclusion, il n'est actuellement pas possible de se fier à la durée de vie d'un std :: valeur de retour initializer_list s'étendant dans la fonction appelante. Évitez d'utiliser std::initializer_list pour transmettre des valeurs, car cela peut entraîner un comportement inattendu.

Remarques supplémentaires :

DR 1290 a modifié le libellé de la norme et Les DR 1565 et 1599, qui sont toujours ouverts, abordent des questions connexes. Cependant, la sémantique est encore en cours de définition et il faudra du temps aux compilateurs pour mettre en œuvre les modifications finales.

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