11 июля 2020

#14 Доступность идентификатора при его инициализации

При объявлении и определении переменной можно использовать её идентификатор в правой части. Для обычных переменных это имеет мало смысла:
int i = i + 5;
Но это правомочно. Куда более полезным может оказаться лямбда, которая может вызывать самое себя:
#include <functional>

const std::function<std::size_t (const std::size_t)> f_fib =
[&f_fib](const std::size_t v) {
  if (v <= 1)
    return v;

  return f_fib(v - 2) + f_fib(v - 1);
};

std::cout << f_fib(25);     // 75025
Имя объекта f_fib используется в списке захвата лямбды, чтобы иметь возможность рекурсивно вызвать себя. Обернуть всё в std::function необходимо для того, чтобы избежать проблемы курицы и яйца: если написать auto, то компилятор не сможет понять во что развернуть auto, поскольку f_fib захватывает самое себя.