Maison > développement back-end > C++ > Quelle est la durée de vie d'une liste d'initialisation entre accolades renvoyée par une fonction C ?

Quelle est la durée de vie d'une liste d'initialisation entre accolades renvoyée par une fonction C ?

Patricia Arquette
Libérer: 2024-10-29 18:29:22
original
714 Les gens l'ont consulté

 What is the Lifetime of a Braced-Init-List Returned from a C   Function?

Durée de vie d'une valeur de retour d'une liste d'initialisation entre accolades

En C , renvoyer une liste d'initialisation entre accolades à partir d'une fonction soulève des questions sur la durée de vie de initializer_list et de son tableau sous-jacent.

Aperçu du problème

L'analyse précédente suggère que GCC termine incorrectement le tableau initializer_list avant la fin de l'expression de retour, tandis que Clang préserve de manière incorrecte les objets sans jamais les détruire.

Interprétation standard

Selon la norme C 11, une instruction return avec une liste d'init entre accolades initialise la valeur de retour via copie-list-initialisation. Si le type de retour est une spécialisation de std::initializer_list, un objet initializer_list est construit et initialisé à partir de la liste spécifiée.

Array Lifetime

La initializer_list construite stocke un référence à un tableau d’éléments initialisés à partir de la liste d’initialisation. La durée de vie du tableau est définie comme étant la même que celle de l'objet initializer_list. Cela signifie que dans l'instruction return, le tableau sous-jacent est initialisé à partir de la liste d'init entre accolades et a une durée de vie s'étendant jusqu'à la portée appelante.

Implémentation correcte

Par conséquent, le comportement attendu est que le tableau de initializer_list doit persister dans la fonction appelante, permettant son utilisation ultérieure ou sa liaison à une référence nommée. Cependant, l'implémentation actuelle de GCC libère prématurément le tableau, violant cette attente.

Clarifications supplémentaires

  • Le retour d'une liste d'initialisation entre accolades n'implique pas une copie construction de l’objet restitué. Il utilise simplement l'initialisation de liste de copie pour initialiser la valeur de retour.
  • DR 1290 a révisé le libellé lié à la durée de vie initializer_list, et les DR 1565 et 1599 sont également à l'étude, apportant potentiellement d'autres changements.
  • La liaison d'une référence supplémentaire à initializer_list ne prolonge pas la durée de vie de son tableau sous-jacent, de la même manière qu'une référence à un objet temporaire ne prolonge pas la durée de vie du temporaire.

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!

source:php.cn
Déclaration de ce site Web
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
Derniers articles par auteur
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal