MyTetra Share
Делитесь знаниями!
Как определить рекурсивную лямбду в 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);};



Так же в этом разделе:
 
MyTetra Share v.0.59
Яндекс индекс цитирования