Lambda 的显式返回类型

当我尝试编译这个代码(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); }));
}
148624 次浏览

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

[]() -> Type { }

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

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

但实际上,你的第二个表达式更容易理解。

返回时可以有多个语句:

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

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