如果首先使用非常量初始化,为什么允许对 const 的非常量引用?
Why is a non-const reference to const allowed if first initialised with non-const?
编译器将非常可以理解地禁止以下内容:
const int ci = 1000;
int &r = ci;
因为这意味着我可以尝试通过 r 更改 ci 的值,但 ci 是常量。
那么为什么允许以下,除了首先将一个非常量 int 分配给 r 之外,它与上面相同?
int i;
const int ci = 1000;
int &r = i;
r = ci;
如果尝试通过 r 更改 ci,ci 将保持相同的值。但是,与第一个示例不同,编译器不会捕获它。对此有解释吗?
您不会将r
重新绑定到引用ci
。您正在为r
(i
) 的引用分配ci
的值。
在您的示例中,创建r
作为对i
的引用。因此,当您执行此操作时:
r = ci;
将ci
的值分配给r
,从而分配给i
。您没有更改ci
的值,因此一切都很好。
编辑:不能更改引用绑定到的对象。
我想你自己解释过:
如果尝试通过 r 更改 ci,ci 将保持相同的值。
r(因此,i)包含 ci 值的副本,而不是对 ci 的引用(这是您在第一个示例中所做的)。因此,ci 的常量性质不受影响,编译器允许它。
int i;
const int ci = 1000;
int &r = i;
r = ci;
最后一行的效果与
r = 1000;
您可以尝试整天更改 1000 到r
,但这不会发生。
const
关键字控制您可以通过该特定变量名称执行的操作。它不能确保基础数据永远不会更改。
因此,例如,拥有一个具有可以自由修改的内部状态的对象是相当常见的,但是让该对象分发 const 引用或指向其内部的指针,以便其他人无法直接操作它们。
相关文章:
- #定义c-预处理器常量..我做错了什么
- 用C++中的一个变量定义一个常量
- 什么时候在C++中返回常量引用是个好主意
- 代理对象的常量正确性
- 我想将一个对T类型的非常量左值引用绑定到一个T类型的临时值
- 通过多个头文件使用常量变量
- 在cuda线程之间共享大量常量数据
- 不能在初始值设定项列表中将非常量表达式从类型 'int' 缩小到'unsigned long long'
- 有没有什么方法可以使用一个函数中定义的常量变量,也可以由c++中同一程序中的其他函数使用
- 是默认情况下分配给char数组常量的值
- 私有类型的静态常量成员
- OpenGL大的3D纹理(>2GB)非常慢
- 类似枚举的计算常量
- 递归模板化函数不能分配给具有常量限定类型"const tt &"的变量"state"
- 使用常量键但非常量值进行映射
- 为什么`is_open()`非常常量
- 从getter方法返回常量和非常量值
- 阻止const类函数在引用成员上调用非常常量类函数
- C++初始化非常大的常量数组,最佳实践
- 提高c++中非常大的常量的可读性