首页 > 解决方案 > 如何避免返回对用户定义类型对象的局部变量的引用?

问题描述

我有一个函数在某些条件下返回对全局变量的引用。为了代码的完整性,我需要有另一个相同类型的非局部变量才能在每种情况下从函数中正确返回。全局变量是我自己的类型。
这是我的代码,

mytype_t a; // a is a global variable.

mytype_t &foo(bool b){

   if(b){
      return a;   //this is ok.  
   }

//Here, I need an object of mytype_t to get it back with return statement if b == false.
}

这种情况的解决方案是定义第二个空/空变量。因此,在我不应该返回全局变量的情况下a,我可以返回我的第二个空/空对象。但是,我必须创建第二个全局对象“ constant”以确保空变量始终为空。另一方面,如果我将第二个变量设为常量,则无法从函数中返回它。这种情况有更优雅的解决方案吗?

如果只有mytype_null对象不是,下面的代码就可以正常工作const

#include <iostream>

struct mytype_t{
    mytype_t(int i=0, int j=0){x=i;y=j;}
    int x,y;
};

mytype_t a(8,5); // a is not empty. 

mytype_t mytype_null;  //mytype_null is an empty object.

mytype_t &foo(bool b);

int main()
{
    mytype_t c = foo(false);

    std::cout<<c.x<<"  "<<c.y<<std::endl;

    return 0;
}

mytype_t &foo(bool b){

   if(b) return a;

   return mytype_null;
}

标签: c++

解决方案


但是,我必须使第二个全局对象“常量”以确保空变量始终为空。另一方面,如果我将第二个变量设为常量,则无法从函数中返回它。

可以通过强制转换 const 来返回对 const 对象的非常量引用。在这种情况下,尝试修改引用的 const 对象将导致未定义的行为。这使得这种方法不安全,但只要仔细记录,它有时是合理的。

例如,在std::stringwherestr[str.size()]返回对空终止符的非常量引用但修改它是 UB 的情况下,使用了一些类似的解决方案。

另一种选择是返回指针而不是引用。指针有一个明确的 null 值,它表示什么都没有。通过空指针间接是 UB,所以这同样是不安全的。

这种情况有更优雅的解决方案吗?

是否优雅是主观的,但安全的方法是通过抛出异常从函数返回。


推荐阅读