Rya*_*yan 74 c++ lambda visual-c++ c++11 visual-c++-2012
当我尝试编译此代码(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;
});
}
Run Code Online (Sandbox Code Playgroud)
我是如何指定lambda具有'void'返回类型的.此外,如何指定lambda具有'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); }));
}
Run Code Online (Sandbox Code Playgroud)
Set*_*gie 165
您可以-> Type
在参数列表后使用显式指定lambda的返回类型:
[]() -> Type { }
Run Code Online (Sandbox Code Playgroud)
但是,如果lambda有一个语句并且该语句是一个return语句(并且它返回一个表达式),则编译器可以从返回的表达式的类型中推导出返回类型.lambda中有多个语句,因此不会推断出类型.
Nic*_*las 13
可以推导出lambda的返回类型(在C++ 11中),但只有当只有一个语句时,该语句才是return
返回表达式的语句(例如,初始化列表不是表达式).如果你有一个多语句lambda,那么假定返回类型是无效的.
因此,你应该这样做:
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;
})
Run Code Online (Sandbox Code Playgroud)
但实际上,你的第二个表达方式更具可读性.
当仍然返回时,您可以有多个语句:
[]() -> your_type {return (
your_statement,
even_more_statement = just_add_comma,
return_value);}
Run Code Online (Sandbox Code Playgroud)
http://www.cplusplus.com/doc/tutorial/operators/#comma
归档时间: |
|
查看次数: |
87087 次 |
最近记录: |