看看以下代码:
struct s
{
s& operator+() {return*this;}
};
void foo(s &) {}
s bar() {}
int main()
{
foo(bar()); //comp error
foo(+bar()); //ok
}
我认为main()中的两行应该是等价的,因为编译器优化了operator +(),对吗?接受一个而不是另一个有什么意义呢?
答案 0 :(得分:6)
行foo(bar())
正在尝试将类型为s
的rvalue(由bar()
返回的临时值)绑定到const
的非s
左值引用(foo()
的参数)。这是非法的,因此编译错误。 rvalues只能绑定到右值引用或const
左值引用。
另一方面,表达式+bar()
返回一个左值引用(这是operator + ()
的返回类型),可以绑定到左值引用参数foo()
。
请注意:您在此处返回对临时的左值引用。虽然在foo()
中使用它仍然是安全的(临时将在完全评估创建它的完整表达式时被销毁,因此在foo()
返回后),你会得到未定义的行为如果您在某处存储了该引用并稍后将其取消引用。
因此,不应将此视为编译错误的“解决方案”,而应将其视为隐藏编译器的一种方式,以便您可以自由潜入 big 烦恼。