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