114

このコード (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); }));
}
4

3 に答える 3

231

-> Type引数リストの後に使用することで、ラムダの戻り値の型を明示的に指定できます。

[]() -> Type { }

ただし、ラムダに 1 つのステートメントがあり、そのステートメントが return ステートメントである (そして式を返す) 場合、コンパイラは、返された 1 つの式の型から戻り値の型を推測できます。ラムダに複数のステートメントがあるため、型は推測されません。

于 2012-03-08T15:26:51.490 に答える
20

ラムダ (C++11) の戻り値の型を推測できますが、それはステートメントが 1 つだけあり、そのステートメントがreturn式を返すステートメントである場合に限られます (たとえば、初期化子リストは式ではありません)。複数ステートメントのラムダがある場合、戻り値の型は void と見なされます。

したがって、これを行う必要があります。

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

しかし、実際には、2 番目の式の方がはるかに読みやすいです。

于 2012-03-08T16:18:44.940 に答える
9

まだ戻っているときに複数のステートメントを使用できます。

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

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

于 2014-09-27T02:03:19.930 に答える