【发布时间】:2018-09-10 03:10:34
【问题描述】:
在 C++ 中,如果:
int a = 3;
int* p = &a;
那为什么是
const int* &pp = p;
不允许,但是
const int* const &pp = p;
允许吗?
【问题讨论】:
标签: c++ c++11 reference constants
在 C++ 中,如果:
int a = 3;
int* p = &a;
那为什么是
const int* &pp = p;
不允许,但是
const int* const &pp = p;
允许吗?
【问题讨论】:
标签: c++ c++11 reference constants
给定const int* &pp = p;,首先必须将p 隐式转换为const int*。但是转换后的const int* 是临时的,不能绑定到非const 的左值引用(如const int* &)。
Temporary 可以绑定到 const 的左值引用(如const int* const &)(和右值引用),所以const int* const &pp = p; 可以正常工作。并且临时的生命周期延长到引用pp的生命周期。
【讨论】:
当 * 左边的 const 修饰符指向 dest,当 * 右边的 const 修饰符指向 const 修饰符,而你的疑问,local var 的 addr 应该是 const。
【讨论】:
不允许第一次转换的原因是它(微妙且不直观)破坏了 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 限定符时,您必须孤注一掷。
【讨论】: