非const引用只能绑定到左值

时间:2011-08-06 15:45:06

标签: c++

有人可以解释一下如何模拟这个错误吗?以及抱怨的内容。

  

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

2 个答案:

答案 0 :(得分:45)

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

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();

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

答案 1 :(得分:5)

这意味着你不能做这样的事情:

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

foo(bar());

您需要foo引用const引用,或将bar()的结果分配给变量,然后将其传递到foo