この関数aaa
は、ポインターからポインターへの定数 int を想定しています。あなたの変数a
はポインタからポインタへのintです。後者を前者に割り当てるのはエラーです。
とは実際には同じもので、 の署名と一致しint const *a[]
ます。を試した場合、それは別の型 (pointer-to-constant-pointer-to-int) になり、型エラーが再びトリガーされます。const int *a[]
aaa
int * const a[]
aaa
関数が定数ポインターからポインターへの int を取りたい場合は、 を記述する必要がありますaaa(int ** const a)
が、パラメーター値に const 性を持たせても、実際には呼び出すことができるものには影響しません。
編集: 「しかし、constnessは暗黙的に追加されていません-暗黙のキャストで行われますか?(実際の質問はどれですか)」
Constness は、渡す値に暗黙的に追加できます。
void aaa(const int a) {}
int b=5;
aaa(b);
... または 1 つのレベル ポインター
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);
ジェームズ・カンゼは、彼の答えでそれをよりよく説明していると思います。