从对象初始值设定项返回的对局部变量'...'的引用

时间:2019-10-03 17:38:46

标签: c++ function

我试图使操作员超负荷以将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 个答案:

答案 0 :(得分:4)

PPM lhs;对函数而言是本地的,您不能返回对本地变量的引用。 lhs将在函数末尾消失,并且如果您编译后输入未定义的行为域,则将有一个悬空引用。

答案 1 :(得分:0)

您的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 local 新实例

真实 rhs在哪里?

请记住,当您调用重载运算符时,可以有效地调用成员函数:

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

是的,您猜对了,它是this。并且您的运算符不应返回对PPM的引用,而应像doubleint甚至甚至是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;
}