编译器将完全可以理解,不允许以下内容:
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将保持相同的值。然而,与第一个示例不同,它不会被编译器捕获。对此有解释吗?
答案 0 :(得分:5)
您不是要r
重新引用ci
。您将r
(i
)的引用分配为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引用或指向其内部的指针,以便其他人不能直接操作它们