2012-05-29 2 views
9

mi sono imbattuto in un frammento di codiceriferimento const può essere assegnato un int?

const int& reference_to_const_int = 20; 
cout<<"\n reference_to_const_int = "<<reference_to_const_int<<endl;  

Questo codice viene compilato & esegue con uscita: -

reference_to_const_int = 20 

Questo è qualcosa di strano in me. Come so il riferimento non occupano memoria & sono alias per altre variabili. quindi non possiamo dire

int& reference_to_int = 30; 

La dichiarazione di cui sopra non si compila dando errore: -

error: invalid initialization of non-const reference of type ‘int&’ from an rvalue of type ‘int’ 

Che cosa esattamente sta accadendo nel "int const &" caso? È richiesta una spiegazione completa.

Gentile aiuto.

Grazie

+2

Legga questo: http://herbsutter.com/2008/01/01/gotw-88-a-candidate-for-the-most-important-const/ –

+0

Dare un po 'più pensiero, sembra che * debba * essere legale. Se non lo fosse, non saresti mai in grado di impostarlo senza fare più variabili. –

+0

@GigaWatt: di che cosa stai parlando? Credimi, se "it" * dovrebbe * essere legale, dovrebbe * essere *. :) –

risposta

11

Un temporaneo viene creato, ed è legale per vincolare un riferimento const ad esso, ma illegale per associarlo a un non const uno.

È proprio come:

const int& reference_to_const_int = int(20); //LEGAL 
     int& reference_to_const_int = int(20); //ILLEGAL 

Un riferimento const prolunga la vita di una temporanea, è per questo che questo funziona. È solo una regola della lingua.

+0

non passa temporaneamente fuori ambito dopo l'istruzione di assegnazione in modo che l'istruzione di stampa faccia riferimento a un 'int' che è andato fuori campo? –

+3

@FlorianSowade no, i riferimenti const estendono la durata di un temporaneo. –

+4

Ma attenzione, i riferimenti const non prolungano la durata in TUTTI i casi. E si noti inoltre che i compilatori Microsoft C++ infrangono le regole e consentono riferimenti vincolanti non-'convenzionali 'ai provvisori. –

5

Questo comportamento è più facile da capire quando guardiamo a cosa succede quando associamo un riferimento a un oggetto temporaneo. Se scriviamo

const int& reference_to_const_int = 20; //A temporay object int(20) is created. 

il compilatore trasforma sopra il codice in qualcosa di simile a questo:

int temp = 20; 
const int& reference_to_const_int = temp; 

Se non fosse reference_to_const_int const, allora potremmo assegnare un nuovo valore a reference_to_const_int. Fare ciò non cambierebbe letteralmente il valore 20, ma cambierebbe invece la temperatura, che è un oggetto temporaneo e quindi inaccessibile. Se si desidera che solo i riferimenti const siano associati a valori che richiedono i temporanei, il problema viene completamente evitato poiché un riferimento const è di sola lettura.

Perché il C++ consente ai riferimenti const di accettare oggetti temporanei o RVALUES (come valori letterali)?

I luoghi più comuni che vediamo i riferimenti sono come argomenti di funzione o valori di ritorno. Quando un riferimento viene utilizzato come argomento di funzione, qualsiasi modifica al riferimento all'interno della funzione causerà modifiche all'argomento esterno alla funzione.

Se la funzione può prevedere/accettare oggetti temporanei o valori letterali come input e se la funzione rispetta la constatezza dell'oggetto, rendendo l'argomento un riferimento const consentirà di utilizzare la funzione in tutte le situazioni.

Gli oggetti temporanei sono sempre const, quindi se non si utilizza un riferimento const, tale argomento non verrà accettato dal compilatore.

void f(int&) {} 
void g(const int&) {} 
int main() 
{ 
    //f(1); //Error 
    g(1); //OK 
}