在C ++中,如果:
int a = 3;
int* p = &a;
那为什么是
const int* &pp = p;
不允许,但
const int* const &pp = p;
被允许吗?
答案 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
(因为*q
为p
),因此*p = 3
将修改x
,即使x
是const
。
当顶级修饰符是引用而不是指针时,会发生相同的问题。
在多层指针类型中修改const
限定词时,您必须全力以赴。