Явный тип возвращаемого значения лямбда
когда я пытаюсь скомпилировать этот код (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;
});
}
как я указал, что лямбда имеет тип возврата "void". Более того, как я могу указать, что лямбда имеет тип возврата '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); }));
}
3 ответа:
можно явно указать тип возвращаемого значения лямбда с помощью
-> Type
после списка аргументов:[]() -> Type { }
возвращаемый тип лямбды (в C++11) может быть выведен, но только когда есть ровно одно утверждение, и это утверждение является
return
оператор, который возвращает выражение (например, список инициализаторов не является выражением). Если у вас есть лямбда с несколькими операторами, то тип возвращаемого значения считается 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; })
но на самом деле, ваше второе выражение намного более читабельно.