该函数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)
,但是对参数值具有常量性实际上对您可以调用的内容没有影响。
编辑: “但不是隐含地添加了 constness - 是通过隐式转换完成的吗?(这是实际问题)”
常量可以隐式添加到您传递的值中,例如
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);
我认为 James Kanze 在他的回答中解释得更好。