c лямбда с неявным возвратом?

#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;`
  

Все еще существует интерес к более короткому синтаксису лямбда, поэтому в какой-то момент он может появиться, возможно, с другим синтаксисом.