Type de retour explicite de Lambda

Lorsque j’essaie de comstackr ce code (VS2010), j’obtiens l’erreur suivante: error C3499: a lambda that has been specified to have a void return type cannot return a value

 void DataFile::removeComments() { ssortingng::const_iterator start, end; boost::regex expression("^\\s?#"); boost::match_results 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 ssortingng& 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’?

METTRE À JOUR

Les compilés suivants. Quelqu’un peut-il s’il vous plaît me dire pourquoi cela comstack et l’autre pas?

 void DataFile::removeComments() { boost::regex expression("^(\\s+)?#"); boost::match_results 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 ssortingng& 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 déclaration est une instruction return (et renvoie 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, donc il n’en déduit pas le type.

Le type de retour d’un lambda peut être déduit, mais uniquement lorsqu’il y a exactement une instruction, et que cette instruction est une instruction return qui renvoie une expression (une liste d’initialisation n’est pas une expression, par exemple). Si vous avez un lambda multi-instructions, le type de retour est supposé nul.

Par conséquent, vous devriez faire ceci:

  remove_if(rawLines.begin(), rawLines.end(), [&expression, &start, &end, &what, &flags](const ssortingng& line) -> bool { start = line.begin(); end = line.end(); bool temp = boost::regex_search(start, end, what, expression, flags); return temp; }) 

Mais vraiment, votre deuxième expression est beaucoup plus lisible.

Vous pouvez avoir plus d’une instruction quand vous retournez toujours:

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

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