Предупреждение компилятора С++ - возвращающая локальная переменная

Я просто пытаюсь перегрузить оператор +, и я получаю предупреждение этого компилятора

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

Ответы

Ответ 1

Вы не можете вернуть ссылку на локальную переменную. Внутри функции operator+() вы создаете локальную переменную с именем tmp. Он будет уничтожен, как только функция выйдет. Вы не можете вернуть ссылку на эту переменную, потому что она больше не существует, когда вызывающая функция получает возвращаемое значение.

Измените определение функции следующим образом:

const Int operator+(const Int&) const;

Он будет строить без предупреждений и отлично работать.

Ответ 2

Что вы пытаетесь сделать, так это вернуть ссылку на ячейку памяти, которая будет недействительной в тот момент, когда вы ее вернете.

Переменная tmp исчезает, когда она выходит из области видимости (то есть, когда оператор + завершен).

Поскольку ваш тип возвращаемого значения - Int &, а не значение tmp, возвращается в "return tmp", а ссылка на tmp. Это неверно, потому что tmp больше не будет существовать после завершения метода!

Решение: не возвращайтесь в качестве ссылки, а как Int

Ответ 3

tmp имеет класс хранения auto и исчезнет, ​​когда мы выйдем. Ответ заключается в том, чтобы указать static.

static Int tmp = value + p.value;

Хранилище, присвоенное tmp, останется зарезервированным на время работы программы.