2016-07-31 16 views
19

ich einige Probleme habe das Verhalten in diesem Snippet zu verstehen:Konst Verweis auf einen gegossenen int von unsigned int

unsigned int i = 2; 
const int &r = i; 
std::cout << r << "\n"; 
i = 100; 
std::cout << r << "\n"; 

Die erste print-Anweisung gibt 2 als ich erwarten würde, aber wenn ich den Wert der referenzierten ändern Variable, es wird nicht in der Referenz wiedergegeben. Die zweite Druckanweisung gibt auch 2, aber ich denke, es sollte 100 geben?

Wenn ich Variable i in Typ int statt unsigned int mache, funktioniert es, wie ich es erwarte. Was geht hier vor sich?

Live example

+0

Sollte nicht die Referenz sein 'const unsigned int &r = i;'? –

+0

Ja, ich denke, es sollte so sein, aber ich möchte wissen, warum sich dieser bestimmte Ausschnitt so verhält. – KKOrange

+0

... ist es undefiniert? Ich kann nicht herausfinden, ob das stimmt, die anderen Antworten lassen es auch als definiertes Verhalten erscheinen. – KKOrange

Antwort

33

Sie können nur einen Verweis auf ein Objekt desselben Typs haben.

Sie können keinen int Verweis auf einen unsigned int haben.

Was hier geschieht, ist, im Wesentlichen:

const int &r = (int)i; 

Eine neue int temporäre konstruiert wird, ein neues temporäres Objekt und ein const wird auf sie gebunden.

Debugger verwenden, sollten Sie in der Lage sein, die Tatsache zu beachten, dass die Bezugnahme auf ein völlig anderes Objekt bezieht:

(gdb) n 
6 const int &r = i; 
(gdb) 
7 std::cout << r << "\n"; 
(gdb) p i 
$1 = 2 
(gdb) p &i 
$2 = (unsigned int *) 0x7fffffffea0c 
(gdb) p &r 
$3 = (const int *) 0x7fffffffe9fc 
(gdb) q 
9

Die zweite print-Anweisung gibt auch zwei, aber ich denke, dass es 100 geben sollte?

Weil hier ein temporäres int erstellt wird.

Für const int &r = i;, i (unsigned int) zunächst int umgewandelt werden muss, bedeutet eine temporäre int wird erstellt und dann an r gebunden werden (temporär gebunden sein könnte auf const Lvalue), es hat nichts zu tun mit der ursprünglichen Variable i mehr.

Wenn ich Variable I in Typ int anstelle von unsigned int, funktioniert es, wie ich es erwarte.

Da keine Konvertierung und vorübergehend benötigt wird, i könnte r direkt gebunden sein.