返回对本地对象的引用的函数

shi*_*mar 9 c++ reference c++11

我写了一个函数,它返回对本地对象的引用.

Fraction& operator*(Fraction& lhs, Fraction& rhs)
{
    Fraction res(lhs.num*rhs.num,lhs.den*rhs.den);
    return res;
}
Run Code Online (Sandbox Code Playgroud)

函数返回后,res对象将被销毁,接收对象将指向Ex-Fraction对象,导致使用它时出现未定义的行为.任何打算使用此功能的人都会遇到问题.

为什么编译器无法检测到这种情况作为编译时错误?

Pot*_*ter 19

大多数编译器会在您执行此操作时显示警告.您应该始终使用GCC等选项打开警告-Wall.

至于为什么标准不需要错误,这是因为具有流控制的函数将使得很难判断返回值是否引用本地.(并且只有在调用者使用返回值时才会出现未定义的行为.)

  • @Elazar当然,`return fn(local_var);`函数可能返回对其参数的引用,该参数是一个局部变量.或者`t&ref = flag?local:global;`和以后`return ref;`.然后,只有当`flag`为`false`时,编译器必须证明函数返回(而不是异常退出). (8认同)