Явный возвратный тип лямбда
-
09-12-2019 - |
Вопрос
Когда я пытаюсь компилировать этот код (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); }));
}
. Решение
Вы можете явно указать тип возврата лямбда, используя -> Type
после списка аргументов:
[]() -> Type { }
.
Однако, если лямбда имеет одно утверждение, и это утверждение - это оператор возврата (и возвращает выражение), компилятор может вывести тип возврата из типа этого возвращенного выражения.У вас есть несколько утверждений в лямбде, поэтому он не выводится в типе.
Другие советы
Тип возврата лямбда (в C ++ 11) может быть выведен, но только только , когда имеется ровно одно утверждение, и это оператор представляет собой оператор GeneracodicTagcode, который возвращает выражение (инициализаторСписок не является выражением, например).Если у вас есть многоквартирный лямбда, то тип возврата предполагается пустым.
Следовательно, вы должны сделать это:
.
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);}
.