C ++中const引用的用法

时间:2016-03-07 09:35:35

标签: c++

我对C ++中的引用有疑问。

此行int& refVal4 = 10;错误, 但是const int& refVal4 = 10;是对的。

所以我很困惑,谁能帮我解决这个问题?

2 个答案:

答案 0 :(得分:1)

在您的代码中,int &是非const左值引用。 const int &是一个恒定的左值参考。

关于引用绑定的规则是非const左值引用只能绑定到左值表达式。如果您不确定左值表达式是什么,see this answer10是一个prvalue表达式。

正如许多评论中所建议的那样,这条规则并未反映出关于十号或任何事物的性质的一些基本事实。相反,这是一个武断的决定。为了避免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);
}

如果允许非const左值绑定,则此代码将成功编译并且对y无效。 x将绑定到临时int。 Bjarne认为如果这段代码产生编译错误会更好,因为程序员通常不希望这种情况发生。

答案 1 :(得分:0)

int& refVal4 = 10;这里refVal4是对非const的引用。因此,用户可以执行类似refVal4 = 20.的操作现在,如果refVal4指向r值(10),则refVal = 20; (which is same as saying 10=20)没有意义且无效。但是,const int& refVal4 = 10;完全有效,因为它是对常量的引用,因此无法通过说refVal = 20;来修改并导致编译时错误。因此,编译器允许对const的引用引用r值(和l值),因为只允许用户读取 - (int val = refVal4)而不更改引用的值。