【问题标题】:How to return from a non-void function?如何从非空函数返回?
【发布时间】:2013-04-10 20:47:49
【问题描述】:

下面有一个函数可以搜索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;
            }
    }

【问题讨论】:

  • 引用永远不能为空。
  • 返回对容器中元素(的成员)的引用并不是一个好主意。
  • 当您的for 结束时添加return something_meaningfull

标签: c++ pointers reference warnings void


【解决方案1】:

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

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

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

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

【讨论】:

    【解决方案2】:

    您必须考虑的问题是,当您的函数必须返回 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 */ }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-08-14
      • 2021-07-24
      • 1970-01-01
      • 2017-02-26
      • 1970-01-01
      相关资源
      最近更新 更多