2015-06-16 27 views
6

Oggi ho visto un po 'di codice come questo:'const decltype ((a))' non dichiara un riferimento const?

int a = 0; 
const decltype((a)) x = 10; // Error 

const int b = 0; 
decltype ((b)) y = 42; // Correct 

posso capire perché il codice corretto è corretto, ma non riesco a vedere il motivo per cui il codice errato non è corretto.

L'ho provato e l'ho trovato un po 'strano.

const decltype((a)) x = 10; Questo dovrebbe essere un const int& giusto? Ma non si compila! error: non-const lvalue reference to type 'int' cannot bind to a temporary of type 'int'.

L'ho modificato in const decltype((a)) x = a; quindi viene compilato.

Bene, è x un riferimento const? No, ho scoperto che si tratta di un riferimento non const. Posso modificare il valore di a tramite x.

Perché il modificatore const non ha avuto effetto?

+4

Il 'const' si applica al riferimento (e ignorato), piuttosto che al tipo cui si fa riferimento. –

+3

combinando 'decltype' con i modificatori funziona esattamente come applicare i modificatori a un tipo' typedef'-ed. NON è una sostituzione di testo. –

+0

@ T.C. @ ben-voigt Oh, ho capito. Quindi 'const' è applicato all'intero corpo di' int & 'per essere' const riferimento a int', non solo combinato ad esso per essere 'const int &', riferimento a const int ... Right? – CyberLuc

risposta

8

parte errato è corretto perché const è applicato il tipo completo che è int& e aggiungendo const di int& rende int& const che è const riferimento a int. Ma il riferimento è const per sua natura, quindi la parte const viene semplicemente ignorata. Quindi il tipo risultante è ancora int&

Problemi correlati