Причина, по которой первое преобразование не разрешено, заключается в том, что оно (тонко и неинтуитивно) нарушает правильность const. Здесь обсуждается . Короче проблема в следующем:
const int x;
int* p;
const int** q = &p;
*q = &x;
*p = 3;
Если бы третья строка была действительной, четвертая строка установила бы p
для указания на x
(потому что *q
равно p
), поэтому *p = 3
изменит x
, даже если x
const
.
Та же проблема возникает, когда модификатор верхнего уровня является ссылкой, а не указателем.
При изменении квалификаторов const
в многослойных типах указателей вы должны делать все или ничего.