Lambda의 명시 적 반환 유형
이 코드 (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); }));
}
-> Type
인수 목록 뒤에 를 사용하여 람다의 반환 유형을 명시 적으로 지정할 수 있습니다 .
[]() -> Type { }
그러나 람다에 하나의 문이 있고 해당 문이 return 문이고 표현식을 반환하는 경우 컴파일러는 반환 된 해당 표현식의 유형에서 반환 유형을 추론 할 수 있습니다. 람다에 여러 문이 있으므로 유형을 추론하지 않습니다.
람다의 반환 유형 (C ++ 11) 은 정확히 하나의 문이 있고 해당 문이 식을 반환하는 문인 경우 에만 추론 할 수 있습니다 return
(예 : 이니셜 라이저 목록은식이 아님). 다중 문 람다가있는 경우 반환 유형은 무효로 간주됩니다.
따라서 다음을 수행해야합니다.
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;
})
그러나 실제로 두 번째 표현은 훨씬 더 읽기 쉽습니다.
여전히 반환 될 때 두 개 이상의 문을 가질 수 있습니다.
[]() -> your_type {return (
your_statement,
even_more_statement = just_add_comma,
return_value);}
http://www.cplusplus.com/doc/tutorial/operators/#comma
참고 URL : https://stackoverflow.com/questions/9620098/explicit-return-type-of-lambda
'Programing' 카테고리의 다른 글
지난 10 일 동안의 날짜로 기록을 나열하는 방법은 무엇입니까? (0) | 2020.10.26 |
---|---|
Class.getName () 클래스의 이름 만 가져옵니다. (0) | 2020.10.26 |
Laravel 예기치 않은 오류 "클래스 사용자가 3 개의 추상 메서드를 포함합니다…" (0) | 2020.10.26 |
도구 상자에 표시되지 않는 사용자 컨트롤 (0) | 2020.10.26 |
MySQL에서 날짜 범위 중복 확인 (0) | 2020.10.26 |