web-dev-qa-db-fra.com

Type de retour Lambda explicite

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

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.

159
Seth Carnegie

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.

11
Nicol Bolas

Vous pouvez avoir plus d'une déclaration à votre retour:

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

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

5
Valen