2016-11-29 3 views
3

Aus irgendeinem Grund habe ich diese genaue Frage nicht gefunden. Warum ist es erlaubt, eine rvalue an const lvalue reference zu binden, obwohl es unmöglich ist, das gleiche ohne die const?Binden von rvalue an const lvalue reference

Ich verstehe, dass die Lebensdauer des Rvalue irgendwie eine Erweiterung erhält (im ersten Fall), aber wenn ja, warum würde der Compiler es nicht erlauben, diesen 'rvalue' zu ändern, der eigentlich kein temporäres Objekt mehr ist.

Betrachten wir zum Beispiel den folgenden Code:

int main(){ 
    int &i=3; //produces error 
    const int&j =3; //compiles 
    return 1; 
} 
+0

Frage macht keinen Sinn. 'rvalue's können nicht gebunden werden. Nur Referenzen können an irgendetwas gebunden sein. – SergeyA

Antwort

0

Sie können unter den folgenden Artikel nützlich finden:

http://www.open-std.org/jtc1/sc22/wg21/docs/papers/1993/N0345.pdf

Ich könnte hier völlig falsch sein, aber das ist, wie ich es zu rationalisieren . Ein rvalue ist konstant, er kann nicht geändert werden. Sie können die ganze Zahl 5, Tatsache nicht ändern. Wenn Sie also die Referenzen binden, muss der Lvalue const sein. Andernfalls wird Ihr Compiler einen Fehler aus:

obj & a1 = bar(); 

invalid initialization of non-const reference of type ‘obj&’ from an rvalue of type ‘obj’ 

g ++ verwendet

Die einzige Möglichkeit, sicher eine rvalue zu einem L-Wert zu binden, ist entweder durch den L-Wert als const Markierung oder eine veränderlichen rvalue Referenz verwendet && (eingeführt in C++ 11 glauben?)

struct obj { 
}; 

obj bar() { 
    obj x; 
    return x; 
} 

int main() { 
const obj & a1 = bar(); 
obj && a2 = bar(); 
return 0; 
}; 
+0

Ich verstehe Ihre Art zu denken, aber nachdem Sie den R-Wert in einen L-Wert gebunden haben, geben Sie ihm praktisch einen Namen und verlängern seine Lebensdauer über die aktuelle Zeile hinaus. Und lassen Sie die Rvalue-Referenz für den Moment aus der Gleichung, ich spreche ausschließlich über den Wert Rvalue Const Lvalue ref. Also meine Frage bleibt gleich, warum die Anforderung von 'const lvalue ref' gilt, warum kann nicht einfach 'lvalue ref' genügen? – GoldenSpecOps

0

Wenn Sie sich fragen,

über
void f(const int&); 
f(1); 

gegen

void g(int&); 
g(1); 

die Antwort ist, darüber nachzudenken, was passiert, wenn g wie folgt aussieht:

void g(int& r) { 
    ++r; 
} 
+0

Vielleicht ein einfacher Fall 'int main() {int &i=3; // erzeugt Fehler const int &j =3; // kompiliert return 1; } ' – GoldenSpecOps

+0

@GoldenSpecOps - wenn Sie' ++ i; 'nach der Initialisierung hinzufügen, werden Sie sehen, warum es nicht erlaubt ist; wenn es angefangen hat 'int j = 1; int &i = j; ++ i; 'es wäre okay. –

Verwandte Themen