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