it-swarm.it

Cos'è un riferimento costante? (non un riferimento a una costante)

Una domanda piuttosto teorica ... Perché i riferimenti costanti non si comportano allo stesso modo dei puntatori costanti e posso effettivamente cambiare l'oggetto a cui puntano? Sembrano davvero un'altra semplice dichiarazione delle variabili. Perché dovrei mai usarli? Questo è un breve esempio che eseguo che compila ed esegue senza errori:

int main (){
    int i=0;
    int y=1;    
    int&const icr=i;
    icr=y;          // Can change the object it is pointing to so it's not like a const pointer...
    icr=99;         // Can assign another value but the value is not assigned to y...
    int x=9;
    icr=x;
    cout<<"icr: "<<icr<<", y:"<<y<<endl; 
}
50
Bat0u89

La risposta più chiara ."X & const x" ha senso?

No, non ha senso

Per scoprire cosa significa la dichiarazione di cui sopra, leggerlo da destra a sinistra: "X è un riferimento const a una X". Ma questo è ridondante - riferimenti sono sempre const, nel senso che non puoi mai rimettere a posto un riferimento per fare riferimento a un oggetto diverso. Mai. Con o senza il const.

In altre parole, "X & const x" è funzionalmente equivalente a "X & x" . Dal momento che non stai guadagnando nulla aggiungendo il const dopo il &, you non dovresti aggiungerlo: confonderà le persone - il const ne farà alcuni la gente pensa che la X sia const, come se tu avessi detto "const X & x".

69
Bat0u89

L'istruzione icr=y; non fa riferimento a y; assegna il valore di y alla variabile che icr fa riferimento a i

I riferimenti sono intrinsecamente const, cioè non è possibile modificare ciò a cui si riferiscono. Esistono "const references" che sono in realtà "riferimenti a const", ovvero non è possibile modificare il valore dell'oggetto a cui si riferiscono. Sono dichiarati const int& o int const& piuttosto che int& const.

45
mattnewport

Cos'è un riferimento costante (non un riferimento a una costante)
A Riferimento costante è in realtà un Riferimento a una costante

Un riferimento/riferimento costante a una costante è indicato da: 

int const &i = j; //or Alternatively
const int &i = j;
i = 1;            //Compilation Error

Significa sostanzialmente che non è possibile modificare il valore dell'oggetto tipo a cui fa riferimento il riferimento.
Per esempio:
Provare a modificare il valore (assegnare 1) della variabile j attraverso il riferimento const, i comporterà l'errore: 

assegnazione del riferimento di sola lettura 'i'


icr=y;          // Can change the object it is pointing to so it's not like a const pointer...
icr=99;

Non cambia il riferimento, esso assegna il valore del tipo a cui si riferisce il riferimento . I riferimenti non possono essere fatti per riferirsi a qualsiasi altra variabile rispetto a quella a cui sono associati a Inizializzazione.

Prima affermazione assegna il valore y a i
Seconda istruzione assegna il valore 99 a i

24
Alok Save

Questo codice è mal formato:

int&const icr=i;

Riferimento: C++ 17 [dcl.ref]/1:

I riferimenti qualificati Cv sono mal formati, tranne quando vengono introdotti i qualificatori di cv tramite l'uso di typedef-name o decltype-specificatore , nel qual caso i qualificatori di cv vengono ignorati.

Questa regola è stata presente in tutte le versioni standardizzate di C++. Perché il codice è mal formato:

  • non dovresti usarlo, e
  • non esiste un comportamento associato. 

Il compilatore dovrebbe rifiutare il programma; e se non lo fa, il comportamento dell'eseguibile è completamente indefinito.

NB: Non sono sicuro di come nessuna delle altre risposte lo abbia già detto ... nessuno ha accesso a un compilatore?

3
M.M

Con "riferimento costante", suppongo che tu intenda davvero "riferimento a dati costanti". Puntatori d'altra parte, può essere un puntatore costante (il puntatore stesso è costante, non i dati a cui punta), un puntatore a dati costanti, o entrambi. 

3
Poodlehat

Come menzionato in altre risposte, un riferimento è intrinsecamente costante.

int &ref = obj;

Una volta inizializzato un riferimento con un oggetto, non è possibile slegare questo riferimento con il suo oggetto a cui fa riferimento. Un riferimento funziona come un alias.

Quando si dichiara un riferimento const, non è altro che un riferimento che fa riferimento a un oggetto const.

const int &ref = obj;

Le frasi dichiarative sopra come const e int determinano le caratteristiche disponibili dell'oggetto a cui farà riferimento il riferimento. Per essere più chiari, voglio mostrarvi l'equivalente pointer di un riferimento const;

const int *const ptr = &obj;

Quindi la riga di codice sopra è equivalente a un riferimento const nel suo modo di lavorare. Inoltre , c'è un ultimo punto che voglio menzionare;

Un riferimento deve essere inizializzato solo con un oggetto

Quindi quando lo fai, otterrai un errore;

int  &r = 0; // Error: a nonconst reference cannot be initialized to a literal

Questa regola ha un'eccezione. Se il riferimento è dichiarato come const, puoi inizializzarlo anche con valori letterali;

const int  &r = 0; // a valid approach
0
Ozan Yurtsever