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

时间:2014-01-24 17:52:59

标签: c++ reference const

编译器将完全可以理解,不允许以下内容:

const int ci = 1000;
int &r = ci;

因为这意味着我可以尝试通过r更改ci的值,但ci是const。

为什么然后允许以下内容,除了首先为r指定非const int之外,它与上面相同?

int i;
const int ci = 1000;
int &r = i;
r = ci;

如果您尝试通过r更改ci,则ci将保持相同的值。然而,与第一个示例不同,它不会被编译器捕获。对此有解释吗?

5 个答案:

答案 0 :(得分:5)

您不是要r重新引用ci。您将ri)的引用分配为ci的值。

答案 1 :(得分:3)

在您的示例中,r被创建为对i的引用。所以当你这样做时:

r = ci;

您将ci的值分配给r,然后分配给i。你没有改变ci的值,所以一切都很好。

编辑:您无法更改引用绑定的对象。

答案 2 :(得分:1)

我想你自己解释了一下:

  

如果您尝试通过r更改ci,则ci将保持相同的值。

r(并且因此,i)包含ci值的副本,而不是对ci的引用(这是您在第一个示例中所做的)。所以ci的const性质不受影响,编译器允许它。

答案 3 :(得分:1)

int i;
const int ci = 1000;
int &r = i;
r = ci;

最后一行与

具有完全相同的效果
r = 1000;

您可以尝试整天改变1000到r,但不会发生。

答案 4 :(得分:0)

const关键字控制您可以通过该特定变量名称执行的操作。它不能确保底层数据永远不会改变。

因此,例如,拥有一个可以自由修改的内部状态的对象是相当常见的,但是让该对象分发const引用或指向其内部的指针,以便其他人不能直接操作它们