2012-05-29 3 views
9

ich über einen Code-Snippet kamconst Referenz kann ein int zugeordnet werden?

const int& reference_to_const_int = 20; 
cout<<"\n reference_to_const_int = "<<reference_to_const_int<<endl;  

Dieser Code kompiliert & mit Ausgang ausführt: -

reference_to_const_int = 20 

Das ist etwas seltsam in für mich ist. Wie ich weiß Referenz nicht besetzen Speicher & sie sind Aliase zu anderen Variablen. daher können wir nicht sagen

int& reference_to_int = 30; 

Die obige Aussage gilt nicht geben Fehler kompilieren: -

error: invalid initialization of non-const reference of type ‘int&’ from an rvalue of type ‘int’ 

Was genau in der "const int &" Fall geschieht? Eine vollständige Erklärung ist erwünscht.

Bitte helfen.

Dank

+2

Lesen Sie dieses: http://herbsutter.com/2008/01/01/gotw-88-a-candidate-for-the-most-important-const/ –

+0

es ein bisschen mehr Gedanken zu machen, es scheint, als würde es * legal sein. Wenn dies nicht der Fall wäre, könnten Sie es nie wirklich einstellen, ohne weitere Variablen zu erstellen. –

+0

@GigaWatt: Was ist das "es", von dem du sprichst? Glauben Sie mir, wenn "es" legal wäre, wäre es *. :) –

Antwort

11

Ein temporäre erstellt wird, und es ist legal einen const Verweis darauf zu binden, aber illegal, es zu einem nicht const ein zu binden.

Es ist ja gerade:

const int& reference_to_const_int = int(20); //LEGAL 
     int& reference_to_const_int = int(20); //ILLEGAL 

A const Referenz verlängert die Lebensdauer eines temporären, das ist, warum das funktioniert. Es ist nur eine Regel der Sprache.

+0

geht nicht das temporäre außerhalb des Bereichs nach dem Zuweisungsanweisung, so dass die print-Anweisung verweist auf eine "int", die außerhalb des Geltungsbereichs gegangen ist? –

+3

@FlorianSowade Nein, const Referenzen verlängern das Leben eines temporären. –

+4

Aber Vorsicht, const Referenzen verlängern nicht die Lebensdauer in allen Fällen. Beachten Sie außerdem, dass Microsoft C++ - Compiler die Regeln brechen und nicht-const-Verweise auf Provisorien binden können. –

5

Dieses Verhalten ist leichter zu verstehen, wenn wir uns ansehen, was passiert, wenn wir einen Verweis auf ein temporäres Objekt binden. Wenn wir

const int& reference_to_const_int = 20; //A temporay object int(20) is created. 

der Compiler schreiben verwandelt oben Code in etwa so aus:

int temp = 20; 
const int& reference_to_const_int = temp; 

Wenn reference_to_const_int waren nicht const, dann könnten wir einen neuen Wert zuweisen reference_to_const_int. Dies würde nicht das Literal 20 ändern, sondern stattdessen temp ändern, was ein temporäres Objekt ist und daher nicht zugänglich ist. Wenn Sie zulassen, dass nur Konst-Referenzen an Werte gebunden werden, die Provisorien erfordern, wird das Problem vollständig vermieden, da eine Konst-Referenz schreibgeschützt ist.

Warum erlaubt C++ const-Referenzen temporäre Objekte oder RVALUES (wie Literale) zu akzeptieren?

Die häufigsten Orte, die wir Referenzen sehen, sind als Funktionsargumente oder Rückgabewerte. Wenn eine Referenz als Funktionsargument verwendet wird, führt jede Änderung an der Referenz innerhalb der Funktion zu Änderungen am Argument außerhalb der Funktion.

Wenn Funktion temporäre Objekte oder Literale als Eingaben erwarten/akzeptieren kann und die Funktion die Const-ness des Objekts berücksichtigt, kann die Funktion in allen Situationen verwendet werden.

Temporäre Objekte sind immer const. Wenn Sie also keine const-Referenz verwenden, wird dieses Argument vom Compiler nicht akzeptiert.

void f(int&) {} 
void g(const int&) {} 
int main() 
{ 
    //f(1); //Error 
    g(1); //OK 
}