Heim  >  Artikel  >  Backend-Entwicklung  >  ## Verlängert das Binden einer Const-Referenz an ein Unterobjekt eines Temporärobjekts dessen Lebensdauer?

## Verlängert das Binden einer Const-Referenz an ein Unterobjekt eines Temporärobjekts dessen Lebensdauer?

DDD
DDDOriginal
2024-10-26 07:22:30423Durchsuche

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

Binding Const Reference to a Sub-Object of a Temporary

Betrachten Sie den folgenden Code:

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

In diesem Beispiel ist center() gibt ein temporäres P2d-Objekt zurück. Es stellt sich die Frage: Wie lang ist die Lebensdauer dieses temporären Objekts?

Unterschiede im Compiler-Verhalten

Verschiedene Compiler weisen unterschiedliche Verhaltensweisen auf:

  • g (Version 5.2.0) zerstört das temporäre P2d-Objekt bevor das printf in main eingibt. Es behält jedoch den Wert seines x-Mitglieds bei. Insbesondere verlängert es die Lebensdauer des temporären Objekts nur dann, wenn das Unterobjekt vom Typ Klasse oder Array ist.
  • clang verlängert die Lebensdauer des temporären P2d-Objekts auf die Lebensdauer der x-Referenz. Daher wird der Destruktor nach dem printf in main aufgerufen.

Gemäß dem C-Standard verlängert das Binden eines Verweises an ein Unterobjekt eines temporären Objekts nicht die Lebensdauer des temporären Objekts . Dies wird jedoch durch CWG 1651 abgedeckt, der eine Änderung zur Verlängerung der Lebensdauer in solchen Fällen vorschlägt.

Ausstehende Lösung

Der Status quo ist, dass nur Vorwerte als Provisorien behandelt werden. Mitgliedszugriffsausdrücke wie center().x werden jedoch sowohl von g als auch von clang als Werte betrachtet.

  • g verlängert die Lebensdauer nicht, wenn skalare Unterobjekte verwendet werden, da [dcl .init.ref]/(5.2.1.1) deckt sie nicht ab.
  • clang implementiert bereits die „neuen“ Regeln zur Lebenszeitverlängerung, die zum korrekten Verhalten werden, sobald CWG 1651 behoben ist .

Mit der bevorstehenden Lösung wird klargestellt, dass Mitgliederzugriffsausdrücke zu temporären Ausdrücken führen und dass das Binden eines Verweises auf diese Ausdrücke die Lebensdauer des entsprechenden temporären Objekts verlängert.

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

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