Explicite le Type de Retour de la Lambda

Quand j'essaie de le compiler 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()
{
  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 préciser que le lambda a un "vide" type de retour. De plus, comment puis-je spécifier que le lambda a 'bool' type de retour?

Mise à JOUR

La suivante compile. Quelqu'un peut-il me dire pourquoi qui compile et l'autre ne l'est 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 le spécifier explicitement avec ->, par exemple [&](double d) -> double { //...
  • Je vous conseille seulement implicitement, capture les variables dont vous avez besoin (seulement [&]...), comme ce que vous avez actuellement est inutilement verbeux.
  • pouvez-vous me dire pourquoi sa verbose? J'ai besoin de ce que, d'expression et de drapeaux dans le lambda et c'est ce que j'ai capturé. Quel manière plus pourrais-je couper?
  • [&expression, &start, &end, &what, &flags]... (la vôtre) vs [&]... (le mien). Maintenant, dites-moi qui est plus détaillé. 😉 [&] dit le lambda à capturer tout ce que vous utilisez à l'intérieur du corps de lambda, par référence. Il a appelé à une "capture par défaut". L'autre est [=] et la capture par copie.
  • Moderne et efficace de C++, Point 31, recommande la capture explicitement, pour éviter de pendre des références. J'ai été mordu par le fait que quelques fois moi-même en tant que punition pour être laz... er, concis. 🙂
  • Que uniquement les questions pour les lambdas survivre à la portée actuelle dans une forme ou une autre, vraiment, qui n'est certainement pas le cas ici.
  • bon point!
  • Par ailleurs, les contraintes sont réduites à déduire de retour de lambdas en C++14. Les types de retour peuvent être déduits pour les lambdas avec plus d'une instruction dans le corps, et aussi longtemps que l'expression de chaque instruction return est du même type, vous pouvez maintenant avoir une déduit le type de retour avec plusieurs instructions return.
  • Voir aussi Est mon livre de la discussion de lamba types de retour de mal?, Quand peut-on omettre le type de retour dans un C++11 lambda?, Pourquoi ne lambda fonctions chute de déduire le type de retour de référence par défaut? et Explicite le Type de Retour de la Lambda.

InformationsquelleAutor Ryan | 2012-03-08