Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/objective-c/24.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ C++;编译器警告-返回局部变量_C++ - Fatal编程技术网

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

C++ C++;编译器警告-返回局部变量,c++,C++,我只是试图重载一个+运算符,我得到了这个编译器警告 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() {} // defaul

我只是试图重载一个+运算符,我得到了这个编译器警告

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;
};

不能返回对局部变量的引用。在
操作符+()
函数中,您正在创建一个名为
tmp
的局部变量。一旦函数退出,它就会被销毁。您不能返回对该变量的引用,因为当调用函数获取返回值时,该变量不再存在

将函数的定义更改为:

const Int operator+(const Int&) const;

它将在没有警告的情况下构建,并且工作正常。

您尝试的是返回对内存位置的引用,该引用在返回时将无效

变量tmp将在超出范围时消失(即运算符+完成时)

因为您的返回类型是Int&,所以在“returntmp”处返回的不是tmp的值,而是对tmp的引用。这是不正确的,因为tmp在方法完成后将不再存在


解决方案:不要作为引用返回,但作为Int

tmp
的存储类为
auto
,退出时将消失。答案是指定静态

static Int tmp = value + p.value;

分配给
tmp
的存储将在程序执行期间保留。

请注意,此解决方案的一个严重副作用是,任何后续调用operator+()都将覆盖“tmp”保留的先前值。这是目前为止我能想到的最糟糕的解决方案。你不认为“const”也应该删除,以避免多余的副本吗?