【发布时间】:2012-03-26 01:55:08
【问题描述】:
当我尝试编译此代码 (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); }));
}
【问题讨论】:
-
您可以使用
->明确指定它,例如[&](double d) -> double { //... -
我建议您只隐式捕获您需要的变量(仅
[&]...),因为您目前拥有的内容是不必要的冗长。 -
[&expression, &start, &end, &what, &flags]...(你的)与[&]...(我的)。现在告诉我谁更冗长。 ;)[&]告诉 lambda 通过引用捕获您在 lambda 体内使用的所有内容。它被称为“捕获默认值”。另一个是[=],将通过副本捕获。 -
@Emile:这仅对以某种形式或其他形式超过当前范围的 lambda 很重要,真的,这里肯定不是这种情况。
-
顺便说一下,C++14 中推导的返回类型 lambda 的约束减少了。可以为主体中具有多个语句的 lambdas 推导返回类型,只要每个返回语句的表达式具有相同的类型,您现在就可以具有多个返回语句的推导返回类型。
标签: c++ visual-c++ lambda c++11 visual-c++-2012