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

3

在C++中,如果:

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

那么为什么是这样呢?
const int* &pp = p; 

不允许,但是

const int* const &pp = p; 

被允许吗?

3个回答

5
给定 const int* &pp = p;,首先需要将 p 隐式转换为 const int*。但是转换后的 const int* 是一个临时值,不能绑定到非const左值引用(如 const int* &)上。

临时值可以绑定到const左值引用(如 const int* const &)(和右值引用),所以 const int* const &pp = p; 可以正常工作。临时值的生命周期延长到引用 pp 的生命周期。


1
当const在*左边时,const修饰指针目标;当const在*右边时,const修饰指针本身;如果你提问,本地变量的地址应该是const。

0
第一个转换不被允许的原因是它(微妙且不直观地)破坏了常量正确性。可以在这里找到讨论here。简而言之,问题在于:
const int x;
int* p;
const int** q = &p;
*q = &x;
*p = 3;

如果第三行是有效的,第四行将设置p指向x(因为*qp),所以*p = 3会修改x,即使xconst
当顶层修饰符是引用而不是指针时,同样的问题会发生。
在多层指针类型中修改const限定符时,您必须全盘接受或全部放弃。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接