什么导致警告“不返回,功能返回非空白”?

时间:2014-02-24 08:16:13

标签: c++ eclipse

我不确定为什么Eclipse报告没有返回值。它不应该知道我要么返回一个值还是扔掉,所以不需要警告?

class PropertyCollection : public PersistentObject
{
  private:
    std::map<const bmd2::string, bmd2::string> container;

  public:
    bmd2::string & operator[](const bmd2::string & s) throw (CustomException);
};


bmd2::string & operator[](const bmd2::string & s) throw (CustomException)
{
  try
  {
    return container.at(s);
  }
  catch (std::out_of_range & e) {
    throw CustomException();
  };
}

3 个答案:

答案 0 :(得分:2)

您的代码确实是正确的。在返回之前没有代码路径可以到达函数的末尾(抛出将导致函数返回)。

日食代码分析器根本看不到(它不是分析仪无法理解的唯一有效代码,你会看到)。在我看来,最好的解决方案(除了修复eclipse,这可能是相当多的工作)将简单地从代码分析器首选项中禁用此特定规则。虽然知道你忘记从代码路径返回可能是有用的,但是不值得误报。此外,只要警告被启用,编译器就应该警告你这些。

有点偏离主题,请阅读有关异常说明符的this

答案 1 :(得分:2)

catch块之后不需要分号(在语法上不需要):

bmd2::string & operator[](const bmd2::string & s) throw (CustomException)
{
  try
  {
    return container.at(s);
  }
  catch (std::out_of_range & e) {
    throw CustomException();
  };                                  // <--- Semicolon not needed
}

因此,编译器可能会告诉您,null语句不是return语句,因此执行会在不返回值的情况下从函数末尾开始执行。

答案 2 :(得分:0)

如果您不想禁用该规则,那么愚蠢的解决方法(可能会导致警告来自编译器的死代码的警告)正在添加{{ 1}}在函数结束时,在catch ...块结束之后。

它将关闭Eclipse,并且不会损害最终结果,但是在稍后分析代码时要对其进行评论以避免困惑是很好的。

return