このコード(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つの式の型から戻り値の型を推測できます。ラムダに複数のステートメントがあるため、型を推定しません。
(C++ 11の)ラムダの戻り値の型は推測できますが、onlyステートメントが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番目の式の方がずっと読みやすくなっています。
それでも返される場合、複数のステートメントを持つことができます。
[]() -> your_type {return (
your_statement,
even_more_statement = just_add_comma,
return_value);}