Lambda的显式返回类型
Explicit Return Type of 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;
});
}
我是如何指定lambda具有"void"返回类型的。更重要的是,我如何指定lambda具有"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
显式指定lambda的返回类型:
[]() -> Type { }
但是,如果lambda有一个语句,而该语句是一个返回语句(并且它返回一个表达式),则编译器可以从该返回表达式的类型推断出返回类型。lambda中有多个语句,因此它不会推导类型。
lambda(在C++11中)的返回类型可以推导出来,但只有当只有一个语句时,并且该语句是返回表达式的return
语句(例如,初始值设定项列表不是表达式)。如果您有一个多语句lambda,那么返回类型被假定为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;
})
但实际上,你的第二个表达式可读性要高得多。
当仍然返回时,可以有多个语句:
[]() -> your_type {return (
your_statement,
even_more_statement = just_add_comma,
return_value);}
http://www.cplusplus.com/doc/tutorial/operators/#comma
相关文章:
- 如何建立使用模板函数的lambda函数的尾部返回类型
- 有没有办法根据 lambda 参数返回类型部分专用化我的模板化函数?
- 如何推导lambda的返回类型
- 尽管显式声明了返回类型,但对lambda的调用是不明确的
- 是否创建具有不同返回类型的lambda
- 防止 lambda 的返回类型扣除
- 我可以让返回类型自动处理具有相同签名但捕获不同内容的 lambda 吗?
- 如何通过返回类型区分两个 lambda 函数?
- 如何在C++中比较 lambda 函数的返回类型?
- 获取模板函数/泛型 lambda 的唯一返回类型
- 尝试使用具有尾随返回类型的 lambda 进行 SFINAE 时出现硬错误
- 具有尾随返回类型的通用 lambda,具体取决于 C++11 中的可变参数
- IF-ELSE语句的Lambda表达式的返回类型扣除
- 在 C++14 中使用通用 lambda 和自动返回类型特征获得不同的结果
- 尝试传递 constexpr lambda 并使用它来显式指定返回类型
- 如何用clang格式分隔lambda的尾部返回类型
- 无法使用 std::map 推断 lambda 的返回类型
- 访问lambda尾随返回类型中的概括捕获对象
- 通用lambda,继承和尾随返回类型:此有效代码
- 是否可以通过从lambda的引用中返回T型对象,而无需使用尾随返回类型语法