【问题标题】:Non-const reference may only be bound to an lvalue非常量引用只能绑定到左值
【发布时间】:2011-08-06 15:45:05
【问题描述】:

谁能解释一下如何模拟这个错误?还有这抱怨什么。

C++ 中的“非 const 引用只能绑定到左值”

【问题讨论】:

  • 哪些术语你不明白,“非常量引用”、“绑定”或“左值”?
  • @Seth:问题是 询问 一些给出此错误的代码。提问者无法满足您的要求。
  • @Steve 是的,我的眼睛错过了 simulate 这个词。

标签: c++


【解决方案1】:

lvalue 大致是赋值语句左侧的任何内容。引用为其他对象提供别名:

std::string s;
std::string & rs = s;  // a non-const reference to s
std::string const & crs = s; // a const reference to s

鉴于上述定义,引用rscrs与引用s相同,只是不能通过crs修改引用的字符串,因为它是const。变量是左值,因此您可以绑定非 const 引用。相反,您可以将 const 引用绑定到临时值,如下所示:

std::string const & crs1 = std::string();

但以下内容是非法的:

std::string & rs1 = std::string();

这是因为使用非常量引用意味着您要修改被引用的对象。但是,当引用超出范围时,绑定到引用的临时对象将被销毁。由于 C++ 创建临时对象并不总是直观的,因此不允许将它们绑定到非 const 引用,以避免您随意更改对象的不愉快意外,只是稍后看到它破坏了一些语句。

【讨论】:

  • @Nicola,这里有一个问题。 int 方法 1(int & a);现在,这同样适用于这个吗?
  • 当然。一个直接的后果是你不能调用这个函数,传递一个整数文字作为参数。
  • @Nicola:实际上,我一直觉得这个限制很随意。例如,您可能会在临时对象上调用非 const 方法,或者 const 方法实际上可能会修改可变属性……
  • @Matthieu M.:好吧,如果可以将临时对象绑定到非 const 引用,我可以看到自己偶尔会被愚弄,但你是对的,这种情况是不一致的。显然出于这个原因,一些标准化委员会成员想要禁止在临时对象上调用非 const 成员函数。
  • @Matthieu:这并不完全一致,但我认为这是有道理的,因为隐式转换应用于函数参数而不是成员函数调用的 LHS。因此,如果可以绑定非 const 引用,那么 void increment(long &i) { ++i; } 会毁了你的一天,然后如果你不小心将 int 变量的名称作为参数,那就指指点点笑吧。但是,如果 X 类型转换为 Y 类型,并且 Y 类型有一个非 const 成员函数 increment,那么您编写 X x; x.increment(); 然后想知道为什么 x 没有改变,就没有同等的危险。
【解决方案2】:

这意味着你不能这样做:

void foo(int &x) { ... }
int bar()        { ... }

foo(bar());

您需要让foo 获取const 引用,或者将bar() 的结果分配给一个变量,然后将其传递给foo

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-03-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-11-07
    相关资源
    最近更新 更多