const B和const A *是不兼容的,即使B被别名为A *

时间:2017-05-25 21:47:34

标签: c++ const typedef

const Bconst A*进行typedef时,为什么BA*无法区分?编译这个简单的例子时:

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的调用很好(因为&aA*),但f2不是,即使const B似乎我喜欢它应该等同于const A*

4 个答案:

答案 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 Bconst符合B,即指针本身,而不是指针。然后const B等同于A* const,即指向非const A的const指针,而不是指向const A的指针;在没有明确转换的情况下无法从const A*进行转换。

答案 3 :(得分:1)

const A*是指向const A的指针。指针是可变的,但它指向的对象不是。
const B是指向const的{​​{1}}指针。指针是不可变的,但它指向的对象是可变的。

如果我记得的话,第二个功能相当于A