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
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!