Maison >développement back-end >C++ >GCC détruit-il les tableaux `std::initializer_list` renvoyés par les fonctions avant la fin de l'expression complète de retour ?

GCC détruit-il les tableaux `std::initializer_list` renvoyés par les fonctions avant la fin de l'expression complète de retour ?

Linda Hamilton
Linda Hamiltonoriginal
2024-10-29 09:35:30487parcourir

 Does GCC Destroy `std::initializer_list` Arrays Returned from Functions Before the End of the Return Full-Expression?

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

Aperçu

Question : Est-il exact que l'implémentation de GCC détruit un std::initializer_list tableau renvoyé par une fonction à la fin de l'expression complète de retour ?

Analyse

Réponse : Non, ce n'est pas correct.

Explication détaillée

Selon la norme C 11, une instruction return avec une liste d'initialisation entre accolades initialise l'objet ou la référence à retourner par copie-list-initialisation à partir de la liste d'initialisation spécifiée. Lorsqu'une liste d'initialisation est utilisée pour créer un objet initializer_list, un tableau est alloué pour stocker les éléments de la liste. La durée de vie du tableau est définie comme suit :

La durée de vie du tableau est la même que celle de l'objet initializer_list.

Dans l'exemple fourni, l'objet initializer_list est créé en retour valeur de la fonction send(). Il est initialisé avec trois objets noisedt puis renvoyé à la fonction recevoir(). La durée de vie du tableau associé à l'objet initializer_list doit s'étendre jusqu'à la fonction recevoir(), permettant d'accéder et d'utiliser les éléments de la liste.

Cependant, l'implémentation de GCC détruit de manière incorrecte le tableau avant la valeur de retour. peut être utilisé, ce qui entraîne un comportement indéfini. Le comportement correct est que le tableau persiste jusqu'à la fin de la fonction recevoir(). Clang et ICC démontrent tous deux le comportement correct.

Conclusion

La gestion par l'implémentation de GCC des valeurs de retour std::initializer_list n'est pas conforme à la norme C 11. Clang et ICC fournissent des implémentations correctes, et il est recommandé d'utiliser ces compilateurs lorsque vous travaillez avec std::initializer_lists.

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