Bedenken Sie den folgenden Codeausschnitt:
<code class="c++">#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>
Wann Mit GCC 5.2.0 kompiliert, wird die temporäre P2d-Instanz zerstört, bevor der printf-Aufruf in main eingegeben wird. Trotzdem bleibt der Wert von x erhalten und wird korrekt gedruckt. Mit anderen Worten: Anstatt x direkt an das x-Mitglied des P2d-Temporärs zu binden, wird ein zweites temporäres Double erstellt, um den Wert des Mitglieds zu kopieren.
Andererseits verlängert Clang die Lebensdauer des P2d-Temporärs um die Lebensdauer der x-Referenz, was dazu führt, dass der Destruktor nach dem printf in main aufgerufen wird.
Dies wirft die Frage auf: Ist dieses Verhalten ein Fehler in GCC oder vom Standard erlaubt?
CWG 1651 behebt dieses Problem:
The resolution of issues 616 and 1213, making the result of a member access or subscript expression applied to a prvalue an xvalue, means that binding a reference to such a subobject of a temporary does not extend the temporary's lifetime. [class.temporary] should be revised to ensure that it does.
Derzeit heißt es in [class.temporary]/5: „Der zweite Kontext ist, wenn eine Referenz an ein Temporäres gebunden ist. " Dies wurde so interpretiert, dass es nur für Referenzen gilt, die direkt an temporäre Objekte gebunden sind. Daher wird im obigen Codeausschnitt center().x als Wert behandelt (sowohl von Clang als auch von GCC) und [class.temporary]/5 ist nicht anwendbar.
GCC und Clang haben dies jedoch Die Auflösung von DR 1651, also N3918, wurde noch nicht umgesetzt. In dieser Resolution heißt es ausdrücklich, dass „Mitgliedszugriff und Indexausdrücke, die auf einen temporären Ausdruck angewendet werden, temporäre Ausdrücke ergeben“, und fügt hinzu, dass „das entsprechende temporäre Objekt (falls vorhanden) für die Lebensdauer der Referenz bestehen bleibt.“
Daher gilt: Basierend auf dem Wortlaut von N3918 scheint es, dass Clang das beabsichtigte Verhalten umsetzt, während GCC dies nicht tut. DR 60297 weist darauf hin, dass GCC die Lebensdauer für skalare Unterobjekte von Temporären nicht verlängert, da diese nicht durch [dcl.init.ref]/(5.2.1.1) abgedeckt sind.
Zusammenfassend lässt sich sagen, dass das aktuelle Verhalten in GCC so ist Nach dem aktuellen Wortlaut der Norm korrekt, wird die Norm jedoch wahrscheinlich überarbeitet, um in diesem Fall eine Verlängerung der Lebensdauer zu erfordern. Clang setzt bereits das erwartete zukünftige Verhalten um.
Das obige ist der detaillierte Inhalt von## Verlängert das Binden einer Const-Referenz an den Unterteil eines temporären Objekts dessen Lebensdauer?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!