我只是想重载一个+运算符,我得到这个编译器警告
reference to local variable 'tmp' returned
Run Code Online (Sandbox Code Playgroud)
这是重载的代码
const Int& Int::operator+(const Int& p) const
{
Int tmp = value + p.value;
return tmp;
}
Run Code Online (Sandbox Code Playgroud)
这是班级
class Int{
int value;
public:
Int() {} // default constructor
Int(int v) : value(v) {}
Int& operator=(const Int&);
const Int& operator+(const Int&) const;
};
Run Code Online (Sandbox Code Playgroud)
Sah*_*has 19
您不能返回对局部变量的引用.在operator+()
函数内部,您将创建一个名为的局部变量tmp
.一旦函数退出,它就会被销毁.您不能返回对该变量的引用,因为当调用函数获取返回值时它不再存在.
将您的函数定义更改为:
const Int operator+(const Int&) const;
Run Code Online (Sandbox Code Playgroud)
它会在没有警告的情况下构建并且工作正常.
您尝试执行的操作是返回对内存位置的引用,该引用在您返回时将无效.
当变量tmp超出范围时(即,当operator +完成时),变量tmp将消失.
因为返回类型是Int&,所以tmp的值不是在"return tmp"返回,而是对tmp的引用.这是不正确的,因为方法完成后tmp将不再存在!!
解决方案:不要作为参考返回,而是作为Int