Maison >développement back-end >C++ >Pourquoi la durée de vie d'une valeur de retour `std::initializer_list` diffère-t-elle entre GCC et Clang ?

Pourquoi la durée de vie d'une valeur de retour `std::initializer_list` diffère-t-elle entre GCC et Clang ?

Mary-Kate Olsen
Mary-Kate Olsenoriginal
2024-10-28 10:06:021055parcourir

Why Does the Lifetime of an `std::initializer_list` Return Value Differ Between GCC and Clang?

Durée de vie d'un std::initializer_list Valeur de retour : comportement GCC vs Clang

Dans le code fourni, vous renvoyez un std ::initializer_list à partir d'une fonction et observation d'un comportement inattendu du destructeur. Plus précisément, le tableau renvoyé par la fonction est détruit avant que vous puissiez accéder à ses éléments.

Le problème sous-jacent vient du fait que, selon le standard C, un std::initializer_list possède un tableau d'éléments qui est construit avec la même durée de vie que initializer_list. Cela signifie que, par défaut, le tableau est détruit à la fin de l'instruction return dans votre fonction.

L'implémentation de GCC adhère à ce comportement, contrairement à Clang. Clang maintient la durée de vie du tableau au-delà de la fin de l'instruction return, ce qui n'est pas conforme à la norme. Cependant, le comportement de Clang semble incohérent, car les destructeurs d'objets ne sont jamais appelés. list initialise la valeur de retour via copy-list-initialization, ce qui signifie qu'elle initialise par copie un objet existant. Dans ce cas, un objet initializer_list temporaire est initialisé par copie à partir de la liste entre accolades. Par la suite, un autre objet initializer_list est initialisé par copie à partir du premier.

La norme stipule que la durée de vie du tableau est la même que celle de l'objet initializer_list, mais comme plusieurs copies de initializer_list sont créées, il n'est pas clair quelle durée de vie de l'objet détermine la durée de vie du tableau.GCC interprète la norme en considérant la durée de vie de l'objet initializer_list renvoyé, conduisant à la destruction prématurée du tableau. Cependant, l'exemple fourni dans 8.5.4/6 suggère que la durée de vie du tableau doit s'étendre jusqu'à la fin de l'expression englobante, y compris la fonction de réception.

Résumé des comportements du compilateur et de l'ambiguïté standard

GCC : suit la norme et détruit le tableau à la fin de l'instruction return.

Clang : prolonge la durée de vie du tableau au-delà de l'instruction return mais ne parvient pas à détruire correctement les destructeurs d'objets.

La norme est ambiguë quant à l'objet initializer_list qui détermine la durée de vie du tableau.
  • Recommandation
  • Pour éviter un comportement inattendu, il n'est généralement pas recommandé pour renvoyer un std::initializer_list par valeur. Si vous devez transmettre un nombre variable d'objets, envisagez plutôt d'utiliser une classe conteneur, telle que std::vector.

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