【问题标题】:The usage of const reference in C++C++中const引用的使用
【发布时间】:2016-03-07 09:35:34
【问题描述】:

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

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

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

【问题讨论】:

标签: c++


【解决方案1】:

在您的代码中,int & 是一个非常量左值引用。 const int & 是一个 const 左值引用。

关于引用绑定的规则是非常量左值引用只能绑定到左值表达式。如果您不确定左值表达式是什么,see this answer10 是纯右值表达式。

这条规则并不反映关于数字 10 或任何东西的本质的一些基本事实,正如许多 cmets 所建议的那样。相反,这是一个武断的决定。为了避免 10 的红鲱鱼(顺便说一句,这是一个非常量 int),我们可以考虑;

int & y1 = atoi(6);        // error
const int & y2 = atoi(6);  // OK
int && y3 = atoi(6);       // OK
++y3;                      // OK

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

绑定到10 也是一样的:我们不绑定到某个柏拉图式的理想或某个预设包含10 的固定内存位置。事实上,我们创建了一个临时的int,其值为 10,并绑定到它。说“改变10的值”是无稽之谈。

y3 示例中可以看出,y1 无法工作没有技术原因。事实上,禁止y1 是 Bjarne Stroustrup 做出的设计决定。他认为允许这样做会导致编码人员犯更多错误。例如:

void increment(int &x) { ++x; }

int main()
{
    long y = 123;
    increment(y);
}

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

【讨论】:

    【解决方案2】:

    int& refVal4 = 10; 这里 refVal4 是对非常量的引用。因此,用户可以执行类似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) 而不能更改引用的值。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-01-08
      • 2018-09-23
      • 2013-10-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多