Подтвердить что ты не робот

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;
    }
4b9b3361

Ответ 1

Возвращаемый тип lambdas может быть неявно выведен, но для этого вам нужно иметь один оператор return; почему ваша "работающая" лямбда работает (тип возврата определяется как bool).

sehe-решение явно объявляет возвращаемый тип, поэтому он отлично работает.

Update:

В стандарте С++ 11, §5.1.2/4 указано:

Если лямбда-выражение не включает тип возвращаемого типа возврата, это как будто тип trailing-return-type обозначает следующий тип:

  • Если составной оператор имеет вид { return expression ; } тип возвращаемого выражения после преобразование lvalue-to-rvalue (4.1), преобразование массива в указатель (4.2) и преобразование функции в указатель (4.3);

  • в противном случае void.

Ваша неработающая лямбда попадает во вторую категорию.

Ответ 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.