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?
Il 'const' si applica al riferimento (e ignorato), piuttosto che al tipo cui si fa riferimento. –
combinando 'decltype' con i modificatori funziona esattamente come applicare i modificatori a un tipo' typedef'-ed. NON è una sostituzione di testo. –
@ 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