Maison  >  Article  >  développement back-end  >  La destruction par GCC d'un tableau `std::initializer_list` renvoyé est-elle correcte ?

La destruction par GCC d'un tableau `std::initializer_list` renvoyé est-elle correcte ?

Linda Hamilton
Linda Hamiltonoriginal
2024-11-01 17:08:02328parcourir

Is GCC's Destruction of a Returned `std::initializer_list` Array Correct?

Durée de vie du tableau std::initializer_list renvoyé

La durée de vie d'un tableau std::initializer_list renvoyé par une fonction a suscité des discussions concernant la comportement dans différents compilateurs. La question se pose de savoir si la destruction par GCC du tableau à la fin de l'expression complète de retour est correcte.

Analyse de la norme

Selon C 11 §6.6. 3/2, une instruction return avec une liste d'init entre accolades conduit à ce que l'objet ou la référence renvoyé soit initialisé par copie-liste à partir de la liste d'initialisation. Ce processus initialise un objet initializer_list temporaire et son stockage de tableau sous-jacent à partir de la liste d'initialisation, puis une autre initializer_list est initialisée à partir du premier.

La durée de vie du tableau, telle que définie dans 8.5.4/6, correspond à la durée de vie de l'objet initializer_list. Cela peut être compris à travers un exemple où l'objet et le tableau initializer_list ont une durée de vie d'expression complète pour un std::vector initialisé avec une liste d'init entre accolades.

Valeur de retour d'un Init entre accolades -List

Lorsqu'une liste nue entre accolades est renvoyée, l'initialisation de la liste de copie est utilisée. Ceci est similaire à la syntaxe nocopy X = { 3 }, qui n'implique pas de copie et est identique à l'exemple de 8.5.4/6 où la durée de vie du tableau est prolongée.

Problèmes avec GCC et Clang

Cependant, il existe une différence de mise en œuvre entre GCC et Clang. GCC détruit le tableau avant de revenir, tandis que Clang conserve une liste d'initialisation nommée mais ne détruit jamais les objets de la liste.

Recommandation

Il est conseillé d'éviter d'utiliser std :: initializer_list pour transmettre des valeurs dans l'espoir qu'elles persistent. Les incertitudes dans les implémentations du standard et du compilateur le rendent peu fiable pour préserver la durée de vie des objets.

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