我编写了一个返回对本地对象的引用的函数。
Fraction& operator*(Fraction& lhs, Fraction& rhs)
{
Fraction res(lhs.num*rhs.num,lhs.den*rhs.den);
return res;
}
函数返回后,res对象将被销毁,接收对象将指向Ex-Fraction对象,导致使用它时出现未定义的行为。 任何打算使用此功能的人都会遇到问题。
为什么编译器无法检测到这种情况作为编译时错误?
答案 0 :(得分:19)
大多数编译器会在您执行此操作时显示警告。您应该始终使用GCC -Wall
等选项打开警告。
至于为什么标准不需要错误,这是因为具有流控制的函数将使得很难判断返回值是否引用了本地。 (并且只有在调用者使用返回值时才会出现未定义的行为。)