Lambda bool
Я хочу найти точку, у которой меньше координаты Y (если больше таких точек, найдите ту, которая имеет наименьший X).
При написании его с помощью лямбда:
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;
}
Ответы
Ответ 1
Возвращаемый тип lambdas может быть неявно выведен, но для этого вам нужно иметь один оператор return
; почему ваша "работающая" лямбда работает (тип возврата определяется как bool
).
sehe-решение явно объявляет возвращаемый тип, поэтому он отлично работает.
Update:
В стандарте С++ 11, §5.1.2/4 указано:
Если лямбда-выражение не включает тип возвращаемого типа возврата, это как будто тип trailing-return-type обозначает следующий тип:
Ваша неработающая лямбда попадает во вторую категорию.
Ответ 2
Как отметил Майк, , если тело лямбда является единственным оператором return, то из этого выводится тип возврата (см. 5.1.2/4) (спасибо Майку).
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
.