1. ホーム
  2. c++

[解決済み] Lambdaの明示的な戻り値の型

2022-09-11 20:48:34

質問

このコードをコンパイルしようとすると(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'であることはどのように指定すればよいのでしょうか。

UPDATE

以下はコンパイルされます。なぜそれがコンパイルされ、他がそうでないのか、誰か教えてください。

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

どのように解決するのですか?

ラムダの戻り値の型を明示的に指定するために -> Type を使うことで明示的に指定できます。

[]() -> Type { }

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