Шаг, который вам не хватает, заключается в том, что вам не нужен указатель int *. Линия:
const int *ptr_to_a = &a; // I still promiss i won't change a;
фактически говорит, что вы не измените ptr_to_a, а не a. Так что если вы изменили код так, чтобы он читался так:
const int a = 3; // I promise I won't change a
const int *ptr_to_a = &a; // I promise I won't change ptr_to_a, not a.
(*ptr_to_a) = 5; // a is now 5
a теперь 5. Вы можете изменить сквозную ptr_to_a без предупреждения.
EDIT:
Выше указано неверное. Оказывается, я путал подобную уловку с shared_ptr, в котором вы можете получить доступ к необработанному указателю и изменить значение внутренних данных, не вызывая никаких предупреждений. То есть:
#include <iostream>
#include <boost/shared_ptr.hpp>
int main()
{
const boost::shared_ptr<int>* a = new boost::shared_ptr<int>(new int(3));
*(a->get()) = 5;
std::cout << "A is: " << *(a->get()) << std::endl;
return 0;
}
Будет производить 5.