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