当const B
与const A*
进行typedef时,为什么B
和A*
无法区分?编译这个简单的例子时:
struct A {};
typedef A* B;
void f1(const A* a1);
void f2(const B a2);
int main()
{
const A a;
f1(&a);
f2(&a);
}
我得到以下编译器输出(G ++ 6.3.1):
test.cpp: In function ‘int main()’:
test.cpp:12:8: error: invalid conversion from ‘const A*’ to ‘B {aka A*}’ [-fpermissive]
f2(&a);
请注意,对f1
的调用很好(因为&a
是A*
),但f2
不是,即使const B
似乎我喜欢它应该等同于const A*
。
答案 0 :(得分:2)
这是“领先const”的误导性案例。
如果你有
struct A {};
typedef A* B;
然后const B
实际上是A * const
。 const限定符应用于指针类型,而不是 pointee-type ,因为它位于const A*
中。
旁注,但我赞成“右边的cv-qualifiers”的原因是,用英语从右到左读取类型名称,与实际定义的类型相匹配。例如:
int const * * const * const p;
从右到左读取时,“p是常量指针,常量指针,指针,常量整数”。
答案 1 :(得分:2)
const B
表示A * const
指针本身是一个常量,但指针指向的对象不是常量。
另一方面,const A *
表示指针本身不是常量,但指针指向的对象是常量。
const B
A * const
const A *
不是typedef const A* B;
void f1(const A* a1);
void f2( B a2);
的别名
你可以写
preg_match_all
答案 2 :(得分:2)
即使
const B
在我看来它应该等同于const A*
。
不,对于const B
,const
符合B
,即指针本身,而不是指针。然后const B
等同于A* const
,即指向非const A
的const指针,而不是指向const A
的指针;在没有明确转换的情况下无法从const A*
进行转换。
答案 3 :(得分:1)
const A*
是指向const A
的指针。指针是可变的,但它指向的对象不是。
const B
是指向const
的{{1}}指针。指针是不可变的,但它指向的对象是可变的。
如果我记得的话,第二个功能相当于A
。