9

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

Fraction& operator*(Fraction& lhs, Fraction& rhs)
{
    Fraction res(lhs.num*rhs.num,lhs.den*rhs.den);
    return res;
}

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

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

4

1 回答 1

19

当您这样做时,大多数编译器都会显示警告。您应该始终使用诸如 GCC's 之类的选项打开警告-Wall

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

于 2013-06-11T14:20:00.163 回答