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 ?

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

DDD
DDDoriginal
2024-10-26 07:22:30505parcourir

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

Référence Const de liaison à un sous-objet d'un temporaire

Considérez le code suivant :

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

Dans cet exemple, center() renvoie un objet P2d temporaire. La question se pose : quelle est la durée de vie de cet objet temporaire ?

Différences de comportement du compilateur

Différents compilateurs présentent des comportements différents :

  • g (version 5.2.0) détruit l'objet temporaire P2d avant d'entrer dans le printf dans main. Cependant, il préserve la valeur de son membre x. Notamment, il prolonge la durée de vie du temporaire uniquement si le sous-objet est de type classe ou tableau.
  • clang étend la durée de vie de l'objet temporaire P2d à la durée de vie de la référence x. Ainsi, le destructeur est appelé après le printf dans main.

Selon le standard C, lier une référence à un sous-objet d'un temporaire ne prolonge pas la durée de vie du temporaire . Cependant, ceci est couvert par le CWG 1651, qui propose un changement pour prolonger la durée de vie dans de tels cas.

Résolution en attente

Le statu quo est que seules les valeurs sont traitées comme faisant référence à des valeurs temporaires. Cependant, les expressions d'accès aux membres, comme center().x, sont considérées comme des valeurs à la fois par g et par clang .

  • g ne prolonge pas la durée de vie lors de l'utilisation de sous-objets scalaires car [dcl .init.ref]/(5.2.1.1) ne les couvre pas.
  • clang implémente déjà les "nouvelles" règles d'extension de durée de vie, qui deviendront le comportement correct une fois le CWG 1651 résolu .

La résolution à venir clarifiera que les expressions d'accès des membres aboutissent à des expressions temporaires et que la liaison d'une référence à ces expressions prolonge la durée de vie de l'objet temporaire correspondant.

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