Frage

Folgendes berücksichtigen:

int ival = 1.01;
int &rval = 1.01; // error: non-const reference to a const value.
int &rval = ival;

rval = 1.01;

Die erste Zuweisung von &rval zu einem Literalwert schlägt wie erwartet fehl.Wenn ich diese Zeile auskommentiere, wird der Code kompiliert und ausgeführt.Ich verstehe, warum die Initialisierung fehlschlägt, aber ich bin verwirrt, warum die Zuweisung an rval in der letzten Zeile funktioniert.Ich glaube nicht, dass es erlaubt ist, einem Literalwert eine Referenz zuzuweisen.

BEARBEITEN: Danke für die schnellen Antworten.Ich bin versucht, dies zu löschen, um meine Scham zu verbergen, aber ich denke, ich werde es hier belassen, damit alle anderen zeigen und lachen können.

Zu meiner eigenen Verteidigung muss ich sagen, dass ich die Übungen in einem Buch durcharbeite (C++ Primer), und bei diesem Problem geht es um Referenzen Initialisierung.Dennoch ist es ziemlich peinlich, den Sinn einer Referenz überhaupt so völlig übersehen zu haben.:) :)

War es hilfreich?

Lösung

ival ist kein Literalwert, ist 1.01 die wörtliche Wert. Es kopiert worden ival was eine Variable ist, die die meisten es auf jeden Fall die Verweise auf andere Variablen zugewiesen haben.

Andere Tipps

Nachdem die Referenz initialisiert wurde, ist sie ein Alias ​​für das, wofür sie initialisiert wurde.Sobald eine Referenz initialisiert wurde, können Sie nicht mehr ändern, worauf die Referenz verweist.Sie können jedoch das „Ding“, auf das sich die Referenz bezieht, ändern (falls dies nicht der Fall ist). const).

In der letzten Zeile wird tatsächlich die Variable festgelegt ival auf 1,01 (wieder).

Hier ist etwas, das Sie werden überrascht sein zu finden, dass Sie können tun aber:

const int& x = 42;        // No error!

C ++ erlaubt Initialisierung eine const Referenz mit einem wörtlichen Wert (oder einem anderen rvalue). Was tatsächlich passiert ist, dass der Compiler durch Kopieren der RHS eines temporären erzeugt und initialisiert den Verweis auf diese vorübergehend zu verweisen. Der Compiler stellt sicher, dass die temporären bis Umfang Ausfahrt am Leben bleibt (das heißt, wenn x in diesem Fall aus dem Geltungsbereich).

Beachten Sie, dass dies nicht funktioniert, wenn Membervariablen einer Klasse initialisiert.

Tricky nicht wahr? :)

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top