Maison  >  Article  >  développement back-end  >  ## La liaison d'une référence Const à un sous-objet d'un temporaire prolonge-t-elle sa durée de vie en C ?

## La liaison d'une référence Const à un sous-objet d'un temporaire prolonge-t-elle sa durée de vie en C ?

DDD
DDDoriginal
2024-10-26 04:20:02410parcourir

## Does Binding a Const Reference to a Sub-Object of a Temporary Extend Its Lifetime in C  ?

À 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

  • Ne prolonge pas la durée de vie des sous-objets scalaires car ils ne sont pas considérés comme temporaires sous [dcl.init.ref]/(5.2.1.1).

Clang

  • Reconnaît l'accès des membres et implémente déjà les règles d'extension de durée de vie, même en gérant les castings.

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!

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