c ++ strage解决编译错误的方法

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()中的两行应该是等价的,因为编译器优化了运算符+(),对吧?接受一个而不是另一个有什么意义?

And*_*owl 6

该行foo(bar())试图将类型的rvalue s(返回的临时值)绑定到(参数of )bar()的非const左值引用.这是非法的,因此编译错误.rvalues只能绑定到右值引用或左值引用.sfoo()const

+bar()另一方面,表达式返回一个左值引用(它的返回类型operator + ()),它可以绑定到左值引用参数foo().

但请注意:您正在返回临时值的左值引用.虽然在内部使用它foo()仍然是安全的(临时将在创建它的完整表达式被完全评估时被销毁,因此在foo()返回之后),如果您在某处存储了该引用并稍后取消引用它,您将获得未定义的行为.

因此,而不是把这个作为一个" 解决方案来编译错误",你应该考虑它的方式蒙骗编译器,你可以自由地潜入麻烦.