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 ?
Réponse : Non, ce n'est pas correct.
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.
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!