const_cast

You are not allowed to const_cast variables that are actually const. This results in undefined behavior. const_cast is used to remove the const-ness from references and pointers that ultimately refer to something that is not const.
So, this is allowed:
```
int i = 0;
const int& ref = i;
const int* ptr = &i;

const_cast<int&>(ref) = 3;
*const_cast<int*>(ptr) = 3;
```
It's allowed because i, the object being assigned to, is not const. 
The below is not allowed:
```
const int i = 0;
const int& ref = i;
const int* ptr = &i;

const_cast<int&>(ref) = 3;
*const_cast<int*>(ptr) = 3;
```
because here i is const and you are modifying it by assigning it a new value. The code will compile, but its behaviour is undefined (which can mean anything from "it works just fine" to "the program will crash".)