编译错误的c++离散解决方案

c++ strage solution to compilation error

本文关键字:解决方案 c++ 错误 编译      更新时间:2023-10-16

查看以下代码:

struct s
{
    s&  operator+() {return*this;}
};
void foo(s &)   {}
s bar() {}
int main()
{
    foo(bar());     //comp error
    foo(+bar());    //ok
}

我认为main()中的两行应该是等价的,因为编译器优化了away运算符+(),对吧?接受一个而不接受另一个有什么意义?

foo(bar())试图将类型为sbar()返回的临时值)的右值绑定到对sfoo()的参数)的非const左值引用。这是非法的,因此产生了编译错误。右值只能绑定到右值引用或const左值引用。

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

不过要注意:您在这里返回了一个对临时的左值引用。虽然在foo()内部使用它仍然是安全的(当创建它的完整表达式完全求值时,临时表达式将被销毁,因此在foo()返回后),如果您将该引用存储在某个位置并稍后取消引用,则会得到未定义的行为

因此,与其将此视为"编译错误的解决方案",不如将其视为一种蒙住编译器眼睛的方法,这样您就可以自由地潜入麻烦中。

相关文章: