在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
限定符时,必须全部执行或不执行任何操作