C ++返回本地或临时变量

时间:2014-02-28 13:15:55

标签: c++ local temp

嗨,大家好问一下:

这是我重载的运算符:

const double & Waz::operator()(int i,int j) const
{
return ((WazImpl const)(*p))(i,j);
}

我在Waz课程中的位置:WazImpl * p;在WazImpl类中我有一个operator()

警告是: 警告C4172返回本地变量的地址或临时

据我所知,我正在返回一个在其他地方被破坏的临时变量,我该怎么办才能解决它?

谢谢!

3 个答案:

答案 0 :(得分:3)

如果您剖析该功能,您可以看到它等同于以下内容:

const double& Waz::operator()(int i, int j) const {
    // Cast pointer to callable.
    const WazImpl& wi = static_cast<const WazImpl>(*p);

    // Get result of calling callable.
    double d = wi(i, j);

    // Return REFERENCE to local object.
    return d;
} // All local objects is destroyed and references to them become dangling.

因此,在调用Waz::operator时确实会有一个悬空参考。

一种解决方案是通过 value 返回,它将返回结果的副本。也不要按const value返回,因为它没有意义。

double Waz::operator()(int i, int j) const;

答案 1 :(得分:1)

你有两种可能性。第一个是简单地返回double而不是引用const double &

double Waz::operator()(int i,int j) const
{
   return ((WazImpl const)(*p))(i,j);
}

第二个是返回对原始值的引用,前提是被调用的运算符也将const引用返回到double

const double & Waz::operator()(int i,int j) const
{
   const double &rd = (WazImpl const)(*p))(i,j );

   return rd;
}

这是一个演示第二种方法的简单示例

#include <iostream>

struct A
{
    int & operator ()(){ return a; }
    int a = 10;
};

struct B : A
{
    int & operator ()()
    {
        int &ri = A::operator ()();
        return ri;
    }
};

int main() 
{
    B b;

    b() = 20;

    std::cout << b.a << std::endl;


    return 0;
}

答案 2 :(得分:0)

您应该向我们展示WazImpl的实现,但似乎WazImpl::operator() const会返回double

这意味着((WazImpl const)(*p))(i,j)返回一个临时的(它只存在于Waz :: operator()的范围内)。
Waz::operator()返回double &时,您确实会返回对临时的引用。

您要么返回一个刚刚在WazImpl::operator()中计算的临时值,那么您应该在double中返回Waz::operator(),要么您实际上正在返回对{{}中现有双精度的引用1}}并且您应该修复WazImpl的签名,以便它返回WazImpl::operator() const