在C ++中,如果“ int a = 3; int * p =&a;”,那么为什么不允许“ const int *&pp = p”,但是允许“ const int * const&pp = p”?

时间:2018-09-10 03:10:35

标签: c++ c++11 reference const

在C ++中,如果:

int a = 3; 
int* p = &a; 

那为什么是

const int* &pp = p; 

不允许,但

const int* const &pp = p; 

被允许吗?

3 个答案:

答案 0 :(得分:5)

鉴于const int* &pp = p;p首先必须隐式转换为const int*。但是转换后的const int*是临时的,不能绑定到非常量的左值引用(例如const int* &)。

临时可以绑定到const的左值引用(例如const int* const &)(和右值引用),因此const int* const &pp = p;可以正常工作。并将临时项的生存期延长到引用pp的生存期。

答案 1 :(得分:1)

当*左边的const时,const修饰符指向dest,*右边的const时,const修饰符指向,并且您质疑,本地var shoule的addr为const。

答案 2 :(得分:0)

不允许进行第一次转换的原因是,它(巧妙且不直观地)破坏了const-正确性。有一个讨论here。简而言之,问题是这样的:

const int x;
int* p;
const int** q = &p;
*q = &x;
*p = 3;

如果第三行有效,则第四行将p设置为指向x(因为*qp),因此*p = 3将修改x,即使xconst

当顶级修饰符是引用而不是指针时,会发生相同的问题。

在多层指针类型中修改const限定词时,您必须全力以赴。