如何从非空函数返回?

时间:2013-04-10 20:47:49

标签: c++ pointers reference warnings void

我在下方有一个功能,可以搜索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;
            }
    }

2 个答案:

答案 0 :(得分:3)

  

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

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

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

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

答案 1 :(得分:1)

你必须考虑的问题是,当你的函数必须返回my_type时,如果找不到“无”,你应该返回什么。如何处理这直接影响调用者如何使用此函数和假设。

您可以考虑一些想法。例如,如果您的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 */ }