Quando si usa il qualificatore const nel caso seguente:
const int value=67;
Stiamo dicendo al compilatore che promettiamo di non cambiare il valore della variabile "valore". In quanto tale, il compilatore sostituirà semplicemente le istanze di "valore" con il valore effettivo con cui lo inizializziamo. Dal momento che il compilatore sostituisce ogni istanza della variabile con il suo valore effettivo, dobbiamo inizializzarlo.
const int k; //error,must be initialized.
quando si limita questo valore a un riferimento, il riferimento deve avere un qualificatore per garantire che non si modifichi il valore associato a tramite il riferimento (riferimento lvalue).
const int& c1=value;
c1=56; //error,we cannot modify it through the reference.
ma possiamo anche associare un valore non const a un riferimento const ...
int i=89;
const int& ic=i; //const lvalue-ref
int& ir=i;
ir=7; //ok.ir is not const
ic=67990; //error ic is const
Come per i puntatori:
const int val=90;
int* valp=&val;//error the pointer is not const.
const int* val2p=&val;//ok as they are both const
*val2p =788;//error as it is a pointer to non-writable space
Tuttavia, un puntatore a un const può essere usato per puntare a un oggetto non const. L'idea è che i puntatori ei riferimenti a const "pensano che puntino o si riferiscano a oggetti const".
A differenza dei riferimenti, i puntatori sono oggetti e possono essere resi const. Significa che un puntatore può essere fatto puntare a una particolare memoria e non essere autorizzato a puntare su un'altra memoria una volta inizializzata.
int* const x=&val;//it will point to that memory location only.
Il fatto che "x" sia esso stesso un puntatore non dice nulla sul valore a cui punta.
L'altro caso interessante è il caso "constexpr":
constexpr int* i=nullptr; //it is the pointer that is const.not the value it points to
constexpt const int* ii=&value; //both are const in this case.