2017-12-30 17 views
2

Mit Zeiger kann ich dies tun:auf konstante Referenz Neuzuweisung

int a=1; 
int b=2; 

const int* cnstIntPtr = &a; 
// (*cnstIntPtr)++ does not work, makes sense since value pointed to is constant 
cnstIntPtr = &b; // works, makes sense 

const int* const cnstIntCnstPtr = &a; 
// (*cnstIntCnstPtr)++; does not work, makes sense since value pointed to is constant 
// cnstIntCnstPtr = &b; does not work, makes sense since pointer is constant 

aber mit Referenzen:

const int& cnstIntRef = a; 
// cnstIntRef++; does not work, makes sense since const refers to value at address 
// cnstIntRef = b; why does this not work? "expression must be modifiable lvalue" 

const int& const cnstIntCnstRef = a; 
//cnstIntCnstRef++; does not work, makes sense since const refers to value at address 
//cnstIntCnstRef = b; does not work, makes sense since const refers to value at address 

Warum kann ich nicht auf eine konstante Referenz neu zuzuweisen, wenn die const sein soll Bezug auf den Wert an der Adresse (in Analogie zur Funktionsweise von Zeigern). Wenn das im Allgemeinen nicht möglich ist, warum ist das und was bedeutet die zweite Konstante in

const int& const cnstIntCnstRef?

+3

Es gibt keine Möglichkeit, eine Referenz erneut zu binden. Einmal initialisiert, um auf ein Objekt Bezug zu nehmen, wird es während seiner gesamten Lebensdauer auf dieses Objekt verweisen. Die zweite Konstante in const int & const cnstIntCnstRef ist redundant. –

+0

Was Igor sagte. Mit anderen Worten, wenn Sie "cnstIntCnstRef = b;" du versuchst den refer * ent * zu ändern: Das Ding, auf das * verwiesen wird * (auch bekannt als "a"). Aber das ist nicht erlaubt, da es als const deklariert ist. Und Sie dürfen die Referenz sicherlich nicht auf etwas anderes beziehen (wie zB "b"). – Joe

+0

Wenn Sie eine Referenz neu zuweisen möchten, verwenden Sie 'std :: reference_wrapper'. Beachten Sie, dass es hauptsächlich für generischen Code und Weiterleitungszwecke verwendet wird. –

Antwort

1
// cnstIntRef = b; why does this not work? "expression must be modifiable lvalue" 

Aus dem gleichen Grund wie warum cnstIntRef++; nicht funktioniert. cnstIntRef ist ein Verweis auf const und daher kann der Wert nicht zugewiesen werden.

Wenn dies im Allgemeinen nicht möglich ist, warum ist die

Es ist in der Tat nicht möglich.

Referenzen unterscheiden sich von Zeigern: Sie werden automatisch dereferenziert. Eine Zuweisung zu einer Referenzvariable ist eine Zuweisung zu dem Referenzobjekt. So wie Sie verstehen, dass cnstIntRef++ analog zu (*cnstIntPtr)++ ist, müssen Sie auch verstehen, dass cnstIntRef = a analog zu *cnstIntPtr = a ist.

Als Konsequenz gibt es keine Syntax zum "Neuzuweisen" einer Referenz, um auf ein anderes Objekt zu verweisen. Eine Referenz bezieht sich immer auf genau ein Objekt während seiner gesamten Lebensdauer.


was ist die Bedeutung des zweiten const in

const int& const cnstIntCnstRef? 

Es hat keinen Sinn, weil es schlecht ausgebildet. Im Gegensatz zu Pointern werden Qualifier möglicherweise nicht auf Referenzen angewendet. Sie dürfen nur auf den angegebenen Typ angewendet werden.


dann wie gehe ich mit einem std::vector<const int&>

Sie nicht mit std::vector<const int&> umgehen können, weil const int& ist kein gültiger Typ für ein Element von std::vector. Vector erfordert, dass die Elemente löschbar sind. Referenzen sind nicht löschbar.

Was ich tun muss, ist die Größe von ihm, und später im Konstruktor Körper füllen Sie die Elemente.

Sie können stattdessen einen Vektor von Zeigern verwenden. Oder Vektor von std::reference_wrapper, wenn das für Vorlagenzwecke bequemer ist.

push_back indiskutabel ist, da es die Referenzen vermasselt

push_back wird nicht vermasseln Referenzen, wenn Sie reserve zuerst.

Verwandte Themen