[英]The usage of const reference in C++
我有一个关于 C++ 引用的问题。
这一行int& refVal4 = 10;
是错误的,但是const int& refVal4 = 10;
是对的。
所以我很困惑,谁能帮我解决这个问题?
在您的代码中, int &
是非常量左值引用。 const int &
是一个 const 左值引用。
关于引用绑定的规则是非常量左值引用只能绑定到左值表达式。 如果您不确定左值表达式是什么,请参阅此答案。 10
是一个纯右值表达式。
正如许多评论所建议的那样,这条规则并没有反映关于数字 10 或任何事物的本质的一些基本事实。 相反,这是一个任意的决定。 为了避免10
的红鲱鱼(顺便说一下,这是一个非常量int
),我们可以考虑;
int & y1 = atoi(6); // error
const int & y2 = atoi(6); // OK
int && y3 = atoi(6); // OK
++y3; // OK
在y2
和y3
的情况下,引用绑定的规则是创建一个临时对象,该对象从初始值设定项中的值进行初始化。 然后引用绑定到该临时对象(并且该临时对象的生命周期被扩展以匹配引用的生命周期)。
绑定到10
也是一样:我们不绑定到一些柏拉图式的理想或一些预设为包含10
固定内存位置。 事实上,我们创建了一个值为 10 的临时int
,并绑定到它。 说“改变10
的值”是无稽之谈。
正如您从y3
示例中看到的,没有技术原因导致y1
无法工作。 事实上,禁止y1
是 Bjarne Stroustrup 做出的设计决定。 他认为允许这样做会导致编码人员犯更多错误。 例如:
void increment(int &x) { ++x; }
int main()
{
long y = 123;
increment(y);
}
如果允许非常量左值绑定,则此代码将成功编译并且对y
没有影响。 x
将绑定到临时 int。 Bjarne 觉得如果这段代码出现编译错误会更好,因为程序员通常不希望这种情况发生。
int& refVal4 = 10;
这里 refVal4 是对非常量的引用。 因此,用户可以执行类似refVal4 = 20.
现在,如果 refVal4 指向 r 值 (10),则refVal = 20;
(which is same as saying 10=20)
没有意义且无效。 然而, const int& refVal4 = 10;
完全有效,因为它是对常量的引用,因此不能通过说refVal = 20;
来修改refVal = 20;
并导致编译时错误。 因此,编译器允许对 const 的引用来引用 r 值(和(int val = refVal4)
值),因为用户只能读取 - (int val = refVal4)
而不能更改引用的值。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.