#c #lambda
#c #лямбда
Вопрос:
В приведенном ниже коде, с c 17 std::find_if
, return
необходим предикат сравнения in .
auto it = find_if(V.begin(), V.end(), [](int i) { return i == 1; });
В ситуациях, когда можно вывести возвращаемый тип лямбда-выражения (например, здесь, где он действует как предикат), казалось бы логичным иметь возможность иметь неявное return
значение из лямбда-выражения, поэтому можно просто написать:
auto it = find_if(V.begin(), V.end(), [](int i) { i == 1; });
Это как-то возможно? Существуют ли лямбды, чьи return
намерения и return
типы могут и будут обрабатываться неявно в соответствии с контекстом использования?
Комментарии:
1. Нет, это не R. Вторая лямбда имеет возвращаемый тип
void
.2. стоит прочитать: brevzin.github.io/c /2020/01/15/abbrev-lambdas
3. у вас могут быть лямбды, которые ничего не возвращают, и у вас могут быть операторы, которые ничего не делают. Как бы вы отличили свой случай от случая, который тогда
e == 1;
не должен быть возвращен?4. на самом деле все наоборот.
find_if
является шаблоном, и один из его параметров выводится из типа этого лямбда. Вы просите вычет в противоположном направлении5. Я всегда удивляюсь, как далеко люди готовы зайти, чтобы сэкономить при вводе нескольких символов. Как насчет того факта, что внезапно синтаксис внутри лямбда-выражения будет отличаться от любого другого в вашем коде. Разве это не сбивало бы с толку? Почему вы хотите, чтобы язык был написан таким образом, что вам нужно знать все эти маленькие дополнительные «ярлыки», чтобы понять, что я имею в виду.
Ответ №1:
Было предложение для «сокращенных» лямбд с синтаксисом:
auto it = find_if(V.begin(), V.end(), [](int i) => i == 1);
^^ abbreviated-lambda operator token
Однако это было отклонено по ряду причин, главная из которых заключалась в том, что это привело бы к несоответствию для лямбд, которые могут возвращать ссылку:
[](int* p) { return *p; } // returns `int`
[](int* p) => *p // returns `intamp;`
Все еще существует интерес к более короткому синтаксису лямбда, поэтому в какой-то момент он может появиться, возможно, с другим синтаксисом.