Dav*_*ave 2 c++ compiler-errors reference operators pass-by-reference
看看下面的代码:
struct s
{
s& operator+() {return*this;}
};
void foo(s &) {}
s bar() {}
int main()
{
foo(bar()); //comp error
foo(+bar()); //ok
}
Run Code Online (Sandbox Code Playgroud)
我认为main()中的两行应该是等价的,因为编译器优化了运算符+(),对吧?接受一个而不是另一个有什么意义?
该行foo(bar())试图将类型的rvalue s(返回的临时值)绑定到(参数of )bar()的非const左值引用.这是非法的,因此编译错误.rvalues只能绑定到右值引用或左值引用.sfoo()const
+bar()另一方面,表达式返回一个左值引用(它的返回类型operator + ()),它可以绑定到左值引用参数foo().
但请注意:您正在返回临时值的左值引用.虽然在内部使用它foo()仍然是安全的(临时将在创建它的完整表达式被完全评估时被销毁,因此在foo()返回之后),如果您在某处存储了该引用并稍后取消引用它,您将获得未定义的行为.
因此,而不是把这个作为一个" 解决方案来编译错误",你应该考虑它的方式蒙骗编译器,你可以自由地潜入大麻烦.