|
|||||||
Как определить рекурсивную лямбду в C++
Время создания: 09.09.2019 02:16
Текстовые метки: c++, лямбда, рекурсия, числа Фибоначчи
Раздел: Компьютер - Программирование - Язык C++ (Си++) - Стандарт C++11 и выше
Запись: xintrea/mytetra_syncro/master/base/1550678062t5y840b68m/text.html на raw.github.com
|
|||||||
|
|||||||
Представьте, что нужно написать лямбду, представляющую функцию Фибоначчи. Эта лямбда по-определению должна быть рекурсивной. Если вы попытаетесь записать ее, используя в качестве возвращаемого значения автоматический тип auto, то получите ошибку компиляции: auto fib = [&fib](int n) {return n < 2 ? 1 : fib(n-1) + fib(n-2);}; Ошибка: error C3533: 'auto &': a parameter cannot have a type that contains 'auto' error C3531: 'fib': a symbol whose type contains 'auto' must have an initializer error C3536: 'fib': cannot be used before it is initialized error C2064: term does not evaluate to a function taking 1 arguments Проблема в том, что из-за рекурсии, здесь имеет место быть циклическая зависимость вывода типа, из-за которой и невозможно автоматически вывести тип переменной fib. Чтобы избавиться от нее, необходимо явно определить тип функции, используя std::function: std::function<int(int)> lfib = [&lfib](int n) {return n < 2 ? 1 : lfib(n-1) + lfib(n-2);}; |
|||||||
Так же в этом разделе:
|
|||||||
|
|||||||
|