# [Error] invalid conversion from 'A**' to 'const A**' [-fpermissive]
如题:
class A {};
void f( const A **p ){}
void g( const A * const * p ){}
void k( const A * &p ){}
int main () {
const A *ca = new A();
A *a = new A();
A **p = &a;
k(ca); // [1]
f(p); // [2]
g(p); // [3]
return 0;
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
❓ 提问:
上面代码 [1]、[2]、[3] 中哪些能编译通过,又哪些不能编译通过?
✏️ 解答:
详细
[1] [3] 是正确的,[2] 是错误的。
[2] 处在编译时会报错:[Error] invalid conversion from 'A**' to 'const A**' [-fpermissive]
解析
[1] 处比较好理解,实参是 const A *,形参是 const A * &,两者都限制了 A * 的内容,形参只是多了个引用符号,即地址传递。
要理解 [2] 和 [3],我们得先了解 const 与一级指针 *a、二级指针 **p 的结合。指针