rel*_*xxx 18 c++ lambda visual-studio-2010
我想找到点,它具有较小的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();
}
Run Code Online (Sandbox Code Playgroud)
我正进入(状态:
error C3499: a lambda that has been specified to have a void return type cannot return a value
Run Code Online (Sandbox Code Playgroud)
有什么区别:
// works
std::min_element(begin, end, [](PointAndAngle& p1, PointAndAngle& p2) {
return p1.first->y() < p2.first->y();
}
Run Code Online (Sandbox Code Playgroud)
和
// does not work
std::min_element(begin, end, [](PointAndAngle& p1, PointAndAngle& p2) {
if (p1.first->y() < p2.first->y())
return true;
else
return false;
}
Run Code Online (Sandbox Code Playgroud)
Jon*_*Jon 14
可以隐式推断lambda的返回类型,但是你需要有一个return语句来实现这一点; 这就是为什么你的"工作"lambda工作(返回类型推断为bool).
sehe的解决方案显式声明了返回类型,因此它也可以正常工作.
更新:
C++ 11标准§5.1.2/ 4规定:
如果lambda表达式不包含trailing-return-type,则就好像trailing-return-type表示以下类型:
如果compound-statement的形式
{ return expression ; }是lvalue-to-rvalue转换(4.1),数组到指针转换(4.2)和函数到指针转换(4.3)之后返回表达式的类型;否则,
void.
你不工作的lambda属于第二类.
seh*_*ehe 12
正如迈克指出的那样,如果lambda的主体是一个返回语句,则从中推断出返回类型(见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;
}
Run Code Online (Sandbox Code Playgroud)
注意-> bool.