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
}
Lesen Sie dieses: http://herbsutter.com/2008/01/01/gotw-88-a-candidate-for-the-most-important-const/ –
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. –
@GigaWatt: Was ist das "es", von dem du sprichst? Glauben Sie mir, wenn "es" legal wäre, wäre es *. :) –