有人可以解释一下如何模拟这个错误吗?以及抱怨的内容。
“非const引用只能绑定到C ++中的左值”
答案 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
鉴于上述定义,引用rs
或crs
与引用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
。