Lambda的显式返回types

当我尝试编译这个代码(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”返回types。 更重要的是,我该如何指定lambda具有“bool”返回types?

UPDATE

以下编译。 有人可以告诉我为什么编译和其他不?

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

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

 []() -> Type { } 

但是,如果一个lambda具有一个语句,并且该语句是一个返回语句(并且它返回一个expression式),那么编译器可以从该返回的expression式的types推导出返回types。 你在lambda中有多个语句,所以它不会推导出types。

lambda的返回types可以被推断出来,但是只有当只有一个语句时,并且该语句是一个returnexpression式的return语句(例如,初始化程序列表不是一个expression式)。 如果你有一个多语句lambda,那么返回types被认为是无效的。

所以你应该这样做:

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

但是,真的,你的第二个expression式更具可读性。

返回时可以有多个语句:

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

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