Почему я не могу поместить указатель на константу в правой части назначения?

Почему я не могу поставить const int *cp1 в правой части задания? См. Этот образец

int x1 = 1;
int x2 = 2;

int *p1 = &x1;
int *p2 = &x2;

const int *cp1 = p1;

p2 = p1;    // Compiles fine

p2 = cp1;   //===> Complilation Error

Почему я получаю ошибку в указанном месте? В конце концов, я не пытаюсь изменить постоянное значение, я только пытаюсь использовать постоянное значение.

Я что-то пропустил.

Ответ 1

В конце концов, я не пытаюсь изменить постоянное значение

Неявное преобразование из "указателя в константу" в "указатель на не-const" недопустимо, так как это позволит изменить постоянное значение. Подумайте о следующем коде:

const int x = 1;
const int* cp = &x; // fine
int* p = cp;        // should not be allowed. nor int* p = &x;
*p = 2;             // trying to modify constant (i.e. x) is undefined behaviour

BTW: для вашего кода примера использование const_cast будет прекрасным, поскольку cp1 указывает на неконстантную переменную (т.е. x1).

p2 = const_cast<int*>(cp1);