There are two types of const data storage: true const and contractual const.
const int cn = 5; // true const
A contractual const variable is a non-const one, which is treated as though it were const:
void ReadValue(const int& num){ cout<
When a true const variable is explicitly cast to a non-const one, the result of an attempt to change it is undefined. This is because an implementation may store true const data in the read-only memory (using an explicit cast to remove constness does not change the physical memory properties of a variable). For example:
const int cnum = 0; //true const, may be stored in the machine's ROM const int * pci = &cnum; int *pi = const_cast (pci); // brute force attempt to unconst a variable *pi = 2; // undefined, an attempt to modify a true const variable through a pointer
On the other hand, casting away contractual constness of a variable enables you to change its value:
int num = 0; const int * pci = # // *pci is a contractual const int int *pi = const_cast (pci); // get rid of contractual const *pi = 2; // OK, modify num's value