2013-10-15 10 views
7

Ich lese über Referenzen in C++. Es sagt, dass int& a = 5 Fehler bei der Kompilierung gibt.Warum ist in C++ Int & A = <value> nicht erlaubt?

In Denken in der C++ - Bruce Eckel, Autor sagt, dass Compiler muss zunächst die Speicherung für ein int zuweisen und die Adresse zu erzeugen, um die Referenz zu binden. Der Speicher mussconst sein, weil das Ändern es keinen Sinn machen würde.

Ich bin an dieser Stelle verwirrt. Ich bin nicht in der Lage, die Logik dahinter zu verstehen. Warum kann der Inhalt im Speicher nicht geändert werden? Ich verstehe, dass es nach C++ - Regeln ungültig ist, aber warum?

+0

möglich Duplikat [Wie kommt eine nicht konstante Referenz auf ein temporäres Objekt nicht binden kann?] (Http: // Stackoverflow. com/questions/1565600/how-come-a-non-const-reference-kann nicht an ein temporäres Objekt binden – legends2k

Antwort

6

"Der Speicher muss konstant sein, da es keinen Sinn ergeben würde, ihn zu ändern."

Wenn Sie a ein Verweis auf einen const Wert sein wollen, müssen Sie es als const erklären, weil a wird in einen temporären konstanten Wert Referenzierung und das Ändern es nicht möglich ist.

const int &a = 123; 
a = 1000; // `a` is referencing to temporary 123, it is not possible to change it 
      // We can not change 123 to 1000 
      // Infact, we can change a variable which its value is 123 to 1000 
      // Here `a` is not a normal variable, it's a reference to a const 
      // Generally, `int &a` can not bind to a temporary object 

Für nicht-const Bindungen:

int x = 1; 
int &a = x; 

a ist ein Verweis auf einen L-Wert. Einfach ausgedrückt, es ist ein Alias-Name für eine andere Variable, also sollten Sie auf der rechten Seite eine Variable angeben. Die Referenz a kann nicht geändert und an eine andere Variable nach der ersten Bindung gebunden werden.

In C++ 11, Sie temporäre Objekte/Werte von rvalue Referenzen verweisen können:

int &&a = 123; 
5
int& a = 5; 

Um den obigen Code zu arbeiten int& muss ein temporäres Objekt binden, von Geben Sie int aus dem Ausdruck 5 erstellt. Aber Bindung int& an einen temporay appelliere nicht an Bjarne Stroustrup — und er gab ein Beispiel, ähnlich dem folgenden, um seinen Punkt zu illustrieren:

void f(int &i) { ++i; } 

float x = 10.0; 
f(x); 
std::cout << x <<< std::endl; 

Was wird der std::cout Druck ? Sieht so aus, als würde es 11 drucken.

Es fühlt, ++i das Argument ändert x, aber es funktioniert nicht. Dies ist ein Grund, warum der Ersteller von C++ es nicht zugelassen hat, dass Provisorien an nicht-konstante Referenzen binden.

Allerdings können Sie dies tun:

int const & i = 10; 
int const & j = x; //x is float 

Und da C++ 11, können Sie dies tun:

int && i = 10; 
int && i = x; //x is float 

Hoffnung, das hilft.


1. int& Annahme kann zum temporären Binden von x erstellt.

+1

+1 für das 'f()' Beispiel: ** THIS **. Ich habe mich gelegentlich gefragt, warum L-Refs nicht selbst an Provisorien binden können, aber nie daran gedacht haben. Danke für die Erweiterung meines Horizonts :-) – Angew

+0

Danke für die Antwort. Was ich aus Ihrer Antwort folge, ist, dass _Bjarne Stroustrup es einfach so gemacht hat. Ich möchte nur sicherstellen, dass ich nicht eine Logik verpasse, die hinter diesem ganzen Konzept steckt! –

0

Was Sie tun können, ist

int b=5; 
int &a=b; 

oder

const int& a = 5; 
Verwandte Themen