C++编译器警告 - 返回局部变量

19

我只是想重载一个 + 操作符,但是我得到了这个编译器警告

reference to local variable 'tmp' returned

以下是重载的代码

const Int& Int::operator+(const Int& p) const
{
    Int tmp = value + p.value;
    return tmp;
}

这是该类

class Int{
    int value;
public:
    Int() {}    // default constructor
    Int(int v) : value(v) {}
    Int& operator=(const Int&);
    const Int& operator+(const Int&) const;
};
3个回答

23

你无法返回指向本地变量的引用。在operator+()函数内部,你正在创建一个名为tmp的本地变量。当函数退出时它会被销毁。你不能返回对该变量的引用,因为当调用函数获得返回值时它已不存在。

请更改函数的定义为:

const Int operator+(const Int&) const;

它可以无警告地构建,并且也能正常工作。


你不觉得应该同时移除 'const' 关键字,以避免多余的拷贝吗? - Chucky

11
你试图返回对一个内存位置的引用,但该位置在你返回它的那一刻就已经无效了。
变量 tmp 将在其作用域结束时(即 operator+ 完成时)消失。
因为返回类型是 Int&,所以 "return tmp" 返回的不是 tmp 的值,而是 tmp 的引用。这是不正确的,因为方法完成后,tmp 将不存在!
解决方案:不要返回引用,而是返回 Int。

-2

tmp 的存储类别为 auto,在退出时将会消失。解决方法是指定为静态。

static Int tmp = value + p.value;

tmp所分配的存储空间将在程序运行期间保持保留状态。


1
请注意,此解决方案的一个不好的副作用是,对operator+()的任何后续调用都将覆盖'tmp'之前保存的值。这绝对是我能想到的最糟糕的解决方案。 - Chucky

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接