如果首先使用非常量初始化,为什么允许对 const 的非常量引用?

Why is a non-const reference to const allowed if first initialised with non-const?

本文关键字:非常 常量 const 引用 如果 初始化 为什么      更新时间:2023-10-16

编译器将非常可以理解地禁止以下内容:

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 引用或指向其内部的指针,以便其他人无法直接操作它们。