首页 文章

C返回本地或临时变量

提问于
浏览
1

嗨伙计们这里有些问题:

这是我的重载运算符:

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

我在瓦兹班的哪个地方:WazImpl * p;在WazImpl类我有一个operator()

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

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

谢谢!

3 回答

  • 1

    如果您剖析该函数,您可以看到它等效于以下内容:

    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 时,你确实得到了悬空参考 .

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

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

    你有两种可能性 . 第一个是简单地返回 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;
    }
    
  • 3

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

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

    您要么返回一个刚刚在 WazImpl::operator() 中计算的临时值,那么您应该在 Waz::operator() 中返回 double ,或者您实际上是在 WazImpl 中返回对现有双精度的引用,并且您应该修复 WazImpl::operator() const 的签名以使其返回 const double& .

相关问题