繁体   English   中英

C++中const引用的使用

[英]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

y2y3的情况下,引用绑定的规则是创建一个临时对象,该对象从初始值设定项中的值进行初始化。 然后引用绑定到该临时对象(并且该临时对象的生命周期被扩展以匹配引用的生命周期)。

绑定到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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM