如何避免为用户定义的对象类型返回对局部变量的引用



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

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的情况下,我可以返回第二个空/null对象。但是,我必须使第二个全局对象"const ant"确保空变量始终为空。另一方面,如果我使第二个变量为常数,那么就不可能从函数中返回它。对于这种情况,有没有更优雅的解决方案?

如果只有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;
}

但是,我必须使第二个全局对象为"常量",以确保空变量始终为空。另一方面,如果我使第二个变量为常数,那么就不可能从函数中返回它。

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

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

另一种选择是返回指针而不是引用。指针有一个显式null值,表示不指向任何内容。通过空指针进行分隔是UB,所以这同样是不安全的。

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

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

最新更新