лямбда-возвращение - PullRequest
       0

лямбда-возвращение

18 голосов
/ 25 октября 2011

Я хочу найти точку, у которой координата 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;
    }

Ответы [ 2 ]

14 голосов
/ 25 октября 2011

Возвращаемый тип лямбда-выражений может быть неявно выведен, но для этого необходимо иметь один оператор return;вот почему ваша «рабочая» лямбда работает (тип возвращаемого значения bool).

Решение sehe явно объявляет тип возвращаемого значения, поэтому оно также отлично работает.

Обновление:

Стандарт C ++ 11, §5.1.2 / 4, гласит:

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

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

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

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

12 голосов
/ 25 октября 2011

Как заметил Майк, , если тело лямбды является одним оператором возврата, то из него выводится тип возврата (см. 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.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...