请问有人能够解释如何模拟这个错误?同时,这个错误信息在说什么问题?
"在C++中,非常量引用只能绑定到左值"。
(说明:左值指的是表达式结束后依然存在的持久对象,例如变量或者函数返回值。右值则是表达式结束后临时产生的值,例如字面量或者函数返回的匿名对象。)
请问有人能够解释如何模拟这个错误?同时,这个错误信息在说什么问题?
"在C++中,非常量引用只能绑定到左值"。
lvalue 大致上可以理解为在赋值语句的左侧可能出现的任何内容。而引用则提供了其他对象的别名:
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
您不能修改所引用的字符串,因为它是常量。变量是左值,因此您可以将非常量引用绑定到它。相反,您可以像这样将常量引用绑定到临时值:
std::string const & crs1 = std::string();
然而,以下操作是非法的:
std::string & rs1 = std::string();
这是因为使用非const引用意味着您想要修改所引用的对象。然而,绑定到引用的临时对象在引用超出作用域时被销毁。由于C ++创建临时对象的时间不总是直观的,将它们绑定到非const引用已被禁止,以避免让您惊 unpleasant地发现您喜欢的对象已更改,仅仅是为了在几个语句之后看到它被销毁。
void increment(long &i) { ++i; }
会毁掉你的一天,如果你不小心将一个int
变量的名称作为参数传递,则会指出并嘲笑你。但是,如果类型X转换为类型Y,并且类型Y具有非const成员函数“increment”,则没有等效的危险,您编写X x; x.increment();
然后想知道为什么x
未更改。 - Steve Jessopstd::ofstream("filename") << "hello\n"
是允许的,但是 std::ofstream("filename") << Foo();
则不是,因为相关的operator<<
必须是非成员的。 - Steve Jessopvoid foo(int &x) { ... }
int bar() { ... }
foo(bar());
foo
接受一个const
引用,或者将bar()
的结果赋值给一个变量,然后将该变量传递给foo
函数。