Heim > Backend-Entwicklung > C++ > ## Verlängert das Binden eines Const-Verweises an ein Unterobjekt eines Temporärobjekts dessen Lebensdauer in C?

## Verlängert das Binden eines Const-Verweises an ein Unterobjekt eines Temporärobjekts dessen Lebensdauer in C?

DDD
Freigeben: 2024-10-26 04:20:02
Original
494 Leute haben es durchsucht

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

Informationen zum Binden einer Const-Referenz an ein Unterobjekt eines temporären Objekts

In C-Code wie folgt:

<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>
Nach dem Login kopieren

Verschiedene Compiler verhalten sich hinsichtlich der Lebensdauer des temporären Objekts center() unterschiedlich. GCC zerstört die temporäre Datei, bevor printf in main eingegeben wird, während Clang seine Lebensdauer verlängert, um sie an die der Referenz x anzupassen. Wenn jedoch die x- und y-Mitglieder durch eine benutzerdefinierte Klasse „Double“ ersetzt werden, stimmen beide Compiler überein und verlängern die Lebensdauer des Temporärs.

Standardüberlegungen

Dieses Verhalten wird behoben durch CWG 1651 besagt, dass das Ergebnis eines Mitgliedszugriffs oder eines Indexausdrucks, der auf einen PR-Wert angewendet wird, ein X-Wert ist und dass das Binden eines Verweises an ein solches Unterobjekt eines temporären Objekts dessen Lebensdauer nicht verlängern sollte. Obwohl beide Compiler „center().x“ als Wert behandeln, implementieren sie die von CWG 1651 vorgeschlagene Änderung nicht vollständig.

Compiler-Unterschiede

GCC

  • Verlängert nicht die Lebensdauer für skalare Unterobjekte, da sie gemäß [dcl.init.ref]/(5.2.1.1) nicht als temporäre Objekte gelten.

Clang

  • Erkennt den Mitgliederzugriff und implementiert bereits die Regeln zur Lebenszeitverlängerung, sogar bei der Handhabung von Casts.

Zukünftige Standardänderungen

N3918, eine ausstehende Lösung zu DR 1651, würde klarstellen, dass der Zugriff auf einen temporären Ausdruck über einen Member dessen Lebensdauer verlängern sollte. Nach der Übernahme würde diese Änderung das Verhalten von Clang an den Standard anpassen.

Das obige ist der detaillierte Inhalt von## Verlängert das Binden eines Const-Verweises an ein Unterobjekt eines Temporärobjekts dessen Lebensdauer in C?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Quelle:php.cn
Erklärung dieser Website
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage