Здесь есть два правила:
- Не существует неявных приведений между
T*
и U*
, если T и U являются разными типами.
- Вы можете неявно разыграть
T*
до T const *
. («Указатель на T» может быть приведен к «Указатель на const T»). В C ++, если T
также является указателем, то это правило также может быть применено к нему (связывание).
Так, например:
char**
означает: указатель на указатель на символ .
И const char**
означает: указатель на указатель на const char .
Поскольку указатель на char и указатель на const char - это разные типы, которые отличаются не только по константности, поэтому приведение не допускается. Правильный тип для приведения должен быть константный указатель на символ .
Таким образом, чтобы сохранить правильность const, необходимо добавить ключевое слово const, начиная с крайней правой звездочки.
Таким образом, char**
можно привести к char * const *
, а также к const char * const *
.
Эта цепочка только для C ++. В C эта цепочка не работает, поэтому на этом языке вы не можете правильно разыграть более одного уровня указателей const.