Ссылка на локальную переменную '...', возвращаемую из инициализатора объекта - PullRequest
4 голосов
/ 03 октября 2019

Я пытаюсь перегрузить операторов, чтобы добавить изображения PPM вместе, создав новый образ. Тем не менее, при попытке создать новый объект в функции,

PPM& PPM::operator*(const double& rhs) const {
     int height = this->getHeight();
     int width = this-> getWidth();
     int mc = this-> getMaxColorValue();
     PPM lhs;
     // ...
     return lhs;
}

И есть множество других вещей, заканчивающихся на return(lhs);. Когда я пытаюсь скомпилировать код, я получаю сообщение об ошибке:

error: reference to local variable 'lhs' returned [-Werror=return-local-addr] PPM lhs;

Что не так?

Ответы [ 2 ]

4 голосов
/ 03 октября 2019

PPM lhs; является локальным для функции, и вы не можете вернуть ссылку на локальную переменную. lhs умрет в конце функции, и у вас будет свисающая ссылка, и если она будет скомпилирована, вы попадете в землю неопределенного поведения.

0 голосов
/ 03 октября 2019

Ваш operator* является функцией-членом. Когда вызывается так:

some_ppm * 1.2

Здесь 1.2 это ваш double rhs.

Но каков ваш lhs?

Глядя на вашу функцию,левая сторона - , а не some_ppm. Взгляните:

PPM& PPM::operator*(const double& rhs) const {
     // ...
     PPM lhs;
     // ...
     return lhs;
}

В этом случае lhs всегда является локальным , новым экземпляром из PPM.

Так где же real rhs?

Помните, что когда вы вызывали перегруженный оператор, вы фактически вызываете функцию-член:

some_ppm.operator*(1.2) // actually well formed syntax

И да, выугадал, это this. И ваш оператор не должен возвращать ссылку на PPM, но вместо этого должен делать double или int или даже std::string и возвращать копию :

//v----- return by value
PPM PPM::operator*(const double& rhs) const {
    int height = this->getHeight();
    int width = this-> getWidth();
    int mc = this-> getMaxColorValue();
    PPM result;

    // ...

    return result;
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...