Функция aaa
ожидает указатель на указатель на константу-int.Ваша переменная a
является указателем на указатель на int.Присвоение последнего первому является ошибкой.
и int const *a[]
, и const int *a[]
- это фактически одно и то же, что соответствует сигнатуре aaa
.Если вы попробуете int * const a[]
, это будет другой тип (pointer-to-constant-pointer-to-int) и вы снова вызовете ошибку типа.
Если вы хотите, чтобы ваша функция aaa
чтобы взять константу-указатель-на-указатель-на-int, нужно написать aaa(int ** const a)
, но постоянство значений параметров фактически не влияет на то, с чем вы можете вызывать.
Редактировать: "Но константность не добавляется неявным образом - делается с помощью неявного приведения? (Какой актуальный вопрос)"значение, которое вы передаете, например,
void aaa(const int a) {}
int b=5;
aaa(b);
... или указатель одного уровня
void aaa(const int* a) {}
int *b=new int;
aaa(b);
... но глубже добавить невозможно.Например, это неверно:
void aaa(const int** a) {}
int* b=new int;
int** c=&b;
aaa(c);
Я думаю, что Джеймс Канзе объясняет это намного лучше в своем ответе.