我想找到具有较小Y坐标的点(如果更多这样的点,找到具有最小X的点)。 用lambda编写时:
std::min_element(begin, end, [](PointAndAngle& p1, PointAndAngle& p2) {
if (p1.first->y() < p2.first->y())
return true;
else if (p1.first->y() > p2.first->y())
return false;
else
return p1.first->x() < p2.first->x();
}
我得到了:
error C3499: a lambda that has been specified to have a void return type cannot return a value
有什么区别:
// works
std::min_element(begin, end, [](PointAndAngle& p1, PointAndAngle& p2) {
return p1.first->y() < p2.first->y();
}
和
// does not work
std::min_element(begin, end, [](PointAndAngle& p1, PointAndAngle& p2) {
if (p1.first->y() < p2.first->y())
return true;
else
return false;
}
答案 0 :(得分:13)
可以隐式推断lambdas的返回类型,但是你需要有一个return
语句来实现这一点;这就是你的“工作”lambda工作的原因(返回类型推断为bool
)。
sehe的解决方案显式声明了返回类型,因此它也能正常工作。
<强>更新
C ++ 11标准,§5.1.2/ 4声明:
如果lambda表达式不包含 trailing-return-type ,则为 好像trailing-return-type表示以下类型:
如果复合语句是表格
{ return expression ; }
之后返回表达式的类型 左值到右值的转换(4.1),数组到指针的转换 (4.2),和函数到指针的转换(4.3);否则,
void
。
你的不工作的lambda属于第二类。
答案 1 :(得分:12)
正如Mike所说,如果lambda的主体是单个return语句,那么返回类型就是从中推断出来的(见5.1.2 / 4)(感谢Mike)。
std::min_element(begin, end, [] (const PointAndAngle & p1, const PointAndAngle & p2)
-> bool
{
if (p1.first->y() < p2.first->y())
return true;
else
return false;
}
注意-> bool
。