Lorsque j'essaie de compiler ce code (VS2010), l'erreur suivante s'affiche: 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;
});
}
Comment ai-je spécifié que le lambda a un type de retour 'vide'. De plus, comment puis-je spécifier que le lambda a le type de retour 'bool'?
MISE À JOUR
Le compile suivant. Quelqu'un peut-il s'il vous plaît me dire pourquoi cela compile et l'autre ne le fait pas?
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); }));
}
Vous pouvez spécifier explicitement le type de retour d'un lambda en utilisant -> Type
après la liste des arguments:
[]() -> Type { }
Cependant, si un lambda a une instruction et que cette instruction est une instruction de retour (et qu'elle retourne une expression), le compilateur peut déduire le type de retour du type de cette expression renvoyée. Vous avez plusieurs déclarations dans votre lambda, elle ne déduit donc pas le type.
Le type de retour d'un lambda (en C++ 11) peut être déduit, mais niquement lorsqu'il n'y a qu'une seule instruction, et que cette instruction est une instruction return
qui renvoie une expression ( une liste d'initialiseur n'est pas une expression, par exemple). Si vous avez un lambda à déclarations multiples, le type de retour est considéré comme nul.
Par conséquent, vous devriez faire ceci:
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;
})
Mais en réalité, votre deuxième expression est beaucoup plus lisible.
Vous pouvez avoir plus d'une déclaration à votre retour:
[]() -> your_type {return (
your_statement,
even_more_statement = just_add_comma,
return_value);}