Maison >développement back-end >C++ >## **La liaison d'une référence constante à un sous-objet d'un objet temporaire prolonge-t-elle sa durée de vie ? Une histoire de GCC et Clang**

## **La liaison d'une référence constante à un sous-objet d'un objet temporaire prolonge-t-elle sa durée de vie ? Une histoire de GCC et Clang**

Barbara Streisand
Barbara Streisandoriginal
2024-11-01 06:58:02569parcourir

##  **Does Binding a Constant Reference to a Sub-Object of a Temporary Extend Its Lifetime? A Tale of GCC and Clang**

Liaison d'une référence constante à un sous-objet d'un

Comportement standard temporaire

Le comportement lors de la liaison d'une référence constante à un sous-objet d'un temporaire est défini par la norme C et varie en fonction du fournisseur du compilateur.

Différences GCC et Clang

  • GCC (version 5.2.0) : Détruit l'instance temporaire P2d avant d'entrer printf dans main, en préservant la valeur en créant un autre double temporaire.
  • Clang (version X) : Prolonge la durée de vie de l'instance temporaire P2d à la durée de vie de la référence x, appelant le destructeur après printf dans main.

Explications

Selon CWG 1651, le résultat d'un accès membre ou d'une expression d'indice appliqué à une prvalue doit être traité comme une valeur x. Cela implique que lier une référence à un tel sous-objet d'un temporaire ne devrait pas prolonger la durée de vie du temporaire.

Cependant, dans l'exemple fourni, les deux compilateurs traitent center().x comme une valeur pr. GCC ne prolonge pas la durée de vie lors de l'utilisation de sous-objets scalaires car ils ne sont pas couverts par [dcl.init.ref]/(5.2.1.1). Par conséquent, l'objet temporaire peut être détruit plus tôt.

En revanche, Clang a implémenté la résolution en attente du DR 1651, qui stipule que si E1 est une expression temporaire et que E2 ne désigne pas de champ de bits, alors E1 .E2 est une expression temporaire. Comme center() est une expression temporaire selon cette définition, le libellé modifié dans [class.temporary] /5 s'applique. Il indique explicitement que l'objet temporaire correspondant persiste pendant toute la durée de vie de la référence.

Par conséquent, Clang prolonge la durée de vie de l'instance temporaire P2d dans ce cas, contrairement à GCC.

Conclusion

Le comportement actuel de GCC et de Clang devrait changer une fois que les révisions proposées à la norme C seront adoptées.

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