114

当我尝试编译此代码(VS2010)时,出现以下错误: error C3499: a lambda that has been specified to have a void return type cannot return a value

void DataFile::removeComments()
{
  string::const_iterator start, end;
  boost::regex expression("^\\s?#");
  boost::match_results<std::string::const_iterator> what;
  boost::match_flag_type flags = boost::match_default;
  // Look for lines that either start with a hash (#)
  // or have nothing but white-space preceeding the hash symbol
  remove_if(rawLines.begin(), rawLines.end(), [&expression, &start, &end, &what, &flags](const string& line)
  {
    start = line.begin();
    end = line.end();
    bool temp = boost::regex_search(start, end, what, expression, flags);
    return temp;
  });
}

我如何指定 lambda 具有“void”返回类型。此外,我如何指定 lambda 具有“bool”返回类型?

更新

以下编译。有人可以告诉我为什么编译而另一个不编译吗?

void DataFile::removeComments()
{
  boost::regex expression("^(\\s+)?#");
  boost::match_results<std::string::const_iterator> what;
  boost::match_flag_type flags = boost::match_default;
  // Look for lines that either start with a hash (#)
  // or have nothing but white-space preceeding the hash symbol
  rawLines.erase(remove_if(rawLines.begin(), rawLines.end(), [&expression, &what, &flags](const string& line)
  { return boost::regex_search(line.begin(), line.end(), what, expression, flags); }));
}
4

3 回答 3

231

-> Type您可以在参数列表之后使用显式指定 lambda 的返回类型:

[]() -> Type { }

但是,如果 lambda 有一个语句并且该语句是一个 return 语句(并且它返回一个表达式),则编译器可以从该返回的表达式的类型推断返回类型。您的 lambda 中有多个语句,因此它不会推断类型。

于 2012-03-08T15:26:51.490 回答
20

可以推导出 lambda(在 C++11 中)的返回类型,但前提是只有一个语句,并且该语句是return返回表达式的语句(例如,初始化列表不是表达式)。如果您有一个多语句 lambda,则返回类型假定为 void。

因此,您应该这样做:

  remove_if(rawLines.begin(), rawLines.end(), [&expression, &start, &end, &what, &flags](const string& line) -> bool
  {
    start = line.begin();
    end = line.end();
    bool temp = boost::regex_search(start, end, what, expression, flags);
    return temp;
  })

但实际上,您的第二个表达式更具可读性。

于 2012-03-08T16:18:44.940 回答
9

仍然返回时,您可以有多个语句:

[]() -> your_type {return (
        your_statement,
        even_more_statement = just_add_comma,
        return_value);}

http://www.cplusplus.com/doc/tutorial/operators/#comma

于 2014-09-27T02:03:19.930 回答