在C++;,如果;INTA=3;int*p=&;a&引用;,那么,为什么是;常数整数*&;pp=p";不允许,但“不允许”;常数int*常数和;pp=p";允许吗? 在C++中,如果: int a = 3; int* p = &a;

在C++;,如果;INTA=3;int*p=&;a&引用;,那么,为什么是;常数整数*&;pp=p";不允许,但“不允许”;常数int*常数和;pp=p";允许吗? 在C++中,如果: int a = 3; int* p = &a;,c++,c++11,reference,constants,C++,C++11,Reference,Constants,那为什么呢 const int* &pp = p; 不允许,但 const int* const &pp = p; 是否允许?给定const int*&pp=p,p必须首先隐式转换为const int*。但是转换后的const int*是临时的,不能绑定到对非const的左值引用(比如const int*&) 临时可以绑定到常量的左值引用(如const int*const&)(和右值引用),因此const int*const&pp=p工作正常。当常量在*左侧时,常量修饰符

那为什么呢

const int* &pp = p; 
不允许,但

const int* const &pp = p; 

是否允许?

给定
const int*&pp=p
p
必须首先隐式转换为
const int*
。但是转换后的
const int*
是临时的,不能绑定到对非const的左值引用(比如
const int*&


临时可以绑定到常量的左值引用(如
const int*const&
)(和右值引用),因此
const int*const&pp=p工作正常。当常量在*左侧时,常量修饰符在*右侧时,常量修饰符在*右侧时,常量修饰符在*右侧时,并且您提出问题时,本地变量的addr应该是常量。不允许第一次转换的原因是(微妙而不直观地)破坏了常量的正确性。这里有一个讨论。简言之,问题在于:

const int x;
int* p;
const int** q = &p;
*q = &x;
*p = 3;
如果第三行有效,第四行将设置
p
指向
x
(因为
*q
p
),因此
*p=3
将修改
x
,即使
x
const

当顶级修改器是引用而不是指针时,也会出现同样的问题

在修改多层指针类型中的
const
限定符时,必须全部执行或不执行任何操作