# [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
1
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 的结合。指针

c和c++的区别(二)const和引用、一级指针、二级指针的结合 (opens new window)