2012-12-08 13 views
10

Ho notato che l'assegnazione di un char a un const int& compila, ma assegnandolo a un int& dà un errore di compilazione.assegnazione di char a riferimento int e riferimento const const in C++

char c; 
int& x = c; // this fails to compile 
const int& y = c; // this is ok 

Capisco che non è una buona pratica per fare questo, ma sono curioso di sapere il motivo per cui accade.

Ho cercato una risposta cercando "assegnando al riferimento di tipo diverso", "assegnando char a un riferimento int" e "differenza tra riferimento const e riferimento non const" e ho trovato un numero di messaggi utili (int vs const int&, Weird behaviour when assigning a char to a int variable, Convert char to int in C and C++,), ma non sembrano rispondere alla mia domanda.

Le mie scuse se è già stata data una risposta in precedenza.

+0

@downvoter ti dispiacerebbe spiegare il motivo? Voglio imparare come posso migliorare la qualità delle mie domande qui, dal momento che ho intenzione di visitare questo sito regolarmente. :) –

risposta

8
int& x = c; 

Qui una conversione implicita da char a int sia eseguita dal compilatore. Lo int temporaneo risultante può essere associato solo a un riferimento const. Il collegamento a un numero const int& estenderà inoltre la durata del risultato temporaneo in modo che corrisponda a quello del riferimento a cui è associato.

+0

Grazie per la bella spiegazione. –

3

Questo comportamento è giustificato nello standard N4527 a 8.5.3/P5.2 Riferimenti [dcl.init.ref]

5 Un riferimento di tipo “CV1 T1” viene inizializzato da un'espressione di tipo “cv2 T2” come segue:

...

5.2 Altrimenti, il riferimento deve essere un valore assegnabile riferimento ad un tipo const non volatile (cioè, CV1 è const), oppure il riferimento deve essere un riferimento di valore. [Esempio:

double& rd2 = 2.0; // error: not an lvalue and reference not const 
int i = 2; 
double& rd3 = i; // error: type mismatch and reference not const 

- esempio fine]

1

Il fatto che la linea

const int& y = c; 

crea una temporanea e y lega alla temporanea può essere verificata la seguente:

#include <iostream> 

int main() 
{ 
    char c = 10; 
    const int& y = c; 

    std::cout << (int)c << std::endl; 
    std::cout << y << std::endl; 

    c = 20; 

    std::cout << (int)c << std::endl; 
    std::cout << y << std::endl; 

    return 0; 
} 

Uscita:

10 
10 
20 
10 

Il valore di y non cambia quando il valore di c è stato cambiato.

Problemi correlati