Heim >Backend-Entwicklung >C++ >Warum können nicht konstante L-Wert-Referenzen in C nicht an Temporäre gebunden werden?
Nicht-konstante L-Wert-Referenzen und temporäre Bindungen
In C wird erwartet, dass nicht-konstante L-Wert-Referenzen an L-Werte desselben oder binden abgeleiteter Typ. Bestimmte Situationen, wie z. B. die Bindung an temporäre Objekte, können jedoch zu Fehlern führen.
Warum ist der folgende Code gültig?
int a; const double &m = a;
In diesem Fall wird eine Referenz an einen L-Wert gebunden , und da die Referenz const ist, kann der L-Wert nicht geändert werden. Dies ist in C zulässig, solange die Typen kompatibel sind.
Beim Versuch, eine nicht konstante L-Wert-Referenz an einen L-Wert eines anderen Typs zu binden, tritt jedoch ein Fehler auf:
int a; double &m = a;
Fehler: Nicht-konstante L-Wert-Referenz auf den Typ „double“ kann nicht an einen Wert des nicht verwandten Typs „int“ gebunden werden
Dieser Fehler wird ausgelöst, weil ein temporärer Wert vorliegt beteiligt. Durch die implizite Typkonvertierung von int nach double wird ein temporäres Objekt erstellt. Nicht konstante Referenzen können nicht an temporäre Objekte gebunden werden, da sie erfordern, dass das Objekt eine bekannte Lebensdauer und einen bekannten Speicherort hat. Temporäre Objekte sind naturgemäß für eine begrenzte Dauer vorhanden.
Visual Studio kann diesen Code aufgrund einer Compilererweiterung, die in bestimmten Fällen die Bindung an temporäre Objekte ermöglicht, möglicherweise fehlerfrei kompilieren. Compiler wie GCC kennzeichnen diesen Fehler jedoch korrekt.
Das folgende Beispiel zeigt ein ähnliches Problem mit benutzerdefinierten Typen:
struct Foo {}; Foo &obj = Foo(); // error: binding non-const reference to temporary
Das Verständnis dieses Konzepts ist für die ordnungsgemäße Referenzbehandlung in C von entscheidender Bedeutung und Vermeidung von Laufzeitproblemen im Zusammenhang mit der Objektlebensdauer.
Das obige ist der detaillierte Inhalt vonWarum können nicht konstante L-Wert-Referenzen in C nicht an Temporäre gebunden werden?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!