1

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

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;
            }
    }
4

2 回答 2

3

看来,只要我使用引用作为返回类型而不是指针,就不可能返回类似 null 的值?

嗯,是的,但这不是唯一的问题。引用永远不可能null,但是如果您的if语句从不计算结果会true怎样?你不返回任何东西

由于引用不能为空,因此返回无效null。您必须从所有执行路径返回有效引用。

此外,您的代码充其量是脆弱的。您正在返回对容器中元素成员的引用......该元素可能会在将来的任何时候移动,从而使所述引用无效。

于 2013-04-10T20:49:57.073 回答
1

您必须考虑的问题是,如果在您的函数必须返回时发现“无”,您应该返回什么my_type。你如何处理这个直接影响调用者如何使用这个函数和做出的假设。

您可以考虑一些想法。例如,如果你的value函数返回一个指针类型,你可以只返回NULL来表示什么都没有。如果它返回一个字符串,您可以使用一个空字符串"",甚至可以使用一个特殊的字符串值"none"来表示这一点。因为type_b您可以创建它的一个特殊实例,然后只返回该实例来表示什么。调用 this 的其他函数将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 */ }
于 2013-04-10T22:04:25.020 回答