À propos de la liaison d'une référence Const à un sous-objet d'un temporaire
Dans du code C comme celui-ci :
<code class="cpp">#include <stdio.h> struct P2d { double x, y; P2d(double x, double y) : x(x), y(y) {} ~P2d() { printf("Destructor called\n"); } }; P2d center() { return P2d(10, 10); } int main(int argc, const char *argv[]) { const double& x = center().x; printf("x = %.18g\n", x); return 0; }</code>
Différents compilateurs se comportent différemment concernant la durée de vie de l'objet temporaire center(). GCC détruit le temporaire avant d'entrer printf dans main, tandis que Clang prolonge sa durée de vie pour correspondre à celle de la référence x. Cependant, s'ils sont remplacés par une classe personnalisée Double pour les membres x et y, les deux compilateurs sont d'accord et prolongent la durée de vie du temporaire.
Considérations standard
Ce comportement est traité par CWG 1651, qui stipule que le résultat de l'accès d'un membre ou d'une expression d'indice appliqué à une valeur pr est une valeur x, et que la liaison d'une référence à un tel sous-objet d'un temporaire ne devrait pas prolonger sa durée de vie. Bien que les deux compilateurs traitent center().x comme valeur principale, ils n'implémentent pas entièrement le changement proposé par CWG 1651.
Différences entre les compilateurs
GCC
Clang
Futures modifications standard
N3918, une résolution en attente du DR 1651, clarifierait que l'accès à une expression membre temporaire via devrait prolonger sa durée de vie. Une fois adopté, ce changement alignerait le comportement de Clang sur la norme.
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!