如何从非空函数返回

How to return from a non-void function?

本文关键字:函数 返回      更新时间:2023-10-16

下面有一个函数,它搜索向量my_type。目前,它有一个编译警告:control reaches end of non-void function [-Wreturn-type]。看来,只要我使用引用作为我的返回类型,而不是指针,它是不可能返回一个空值?

struct my_type{
    type_a a;
    type_b b;
}
    type_b& value(type_a& t){
        typename std::vector<my_type>::iterator it;  
        for(it = v.begin(); it != v.end(); ++it){
            if ((*it).a == t) return (*it).b;
            }
    }

看来,只要我使用引用作为我的返回类型,而不是指针,它是不可能返回一个空值?

嗯,是的,但这不是唯一的问题。引用永远不能是null,但是如果您的if语句永远不会求值为true,会发生什么?你不返回任何

由于引用不能为空,所以返回null是无效的。你必须从所有的执行路径返回一个有效的引用。

同样,你的代码是脆弱的。您正在返回对容器中元素成员的引用…

一个可能在将来的任何时候被移动的元素,使得所述引用无效。

您必须考虑的问题是,当您的函数必须返回my_type时,如果发现'nothing',您应该返回什么。如何处理直接影响调用者如何使用该函数和所做的假设。

你可以考虑一些想法。例如,如果您的value函数返回一个指针类型,您可以只返回NULL来表示什么都不表示。如果它返回一个字符串,您可以使用空字符串"",甚至是一个特殊的字符串值,如"none"来表示它。对于type_b,您可以创建它的一个特殊实例,然后返回该实例,不表示任何内容。调用此函数的其他函数将根据该实例检查返回的type_b,看看它是否为空。关键是,有很多方法可以做这件事,你选择哪一种取决于你。

但是更好的方法是使用stl已经提供的东西——特别是std::find_if。例如,您可以创建一个函子来指定何时有匹配:

struct find_b
{
  const type_a &this_a;
  find_b(const type_a &a) : this_a(a) {}
  bool operator() (const my_type &lhs)
  {
    return lhs.a == this_a;
  }
};

那么你可以这样使用:

item = std::find_if(v.begin(), v.end(), find_b(t));
if(item == v.end()) { /* not found */ }
else { /* found, do something useful here */ }