我对C ++中的引用有疑问。
此行int& refVal4 = 10;
错误,
但是const int& refVal4 = 10;
是对的。
所以我很困惑,谁能帮我解决这个问题?
答案 0 :(得分:1)
在您的代码中,int &
是非const左值引用。 const int &
是一个恒定的左值参考。
关于引用绑定的规则是非const左值引用只能绑定到左值表达式。如果您不确定左值表达式是什么,see this answer。 10
是一个prvalue表达式。
正如许多评论中所建议的那样,这条规则并未反映出关于十号或任何事物的性质的一些基本事实。相反,这是一个武断的决定。为了避免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);
}
如果允许非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)
而不更改引用的值。