我有一个函数,它在某些条件下返回对全局变量的引用。为了代码的完整性,我需要有另一个相同类型的非本地变量,才能在任何情况下从函数中正确返回。全局变量属于我自己的类型
这是我的代码,
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,所以这同样是不安全的。
对于这种情况,有更优雅的解决方案吗?
是否优雅是主观的,但安全的方法是通过抛出异常从函数返回。