Immediately Invoked Lambda Expression (IILE)
Last updated
Was this helpful?
Last updated
Was this helpful?
const
— это важно?Неизменяемость (immutability) — залог надежного и понятного кода. Использование const
там, где это возможно, помогает компилятору отлавливать ошибки и делает намерения программиста яснее. Когда другой человек читает ваш код и видит const
, снижается когнитивная нагрузка на мозг — «запоминать изменения данного значения не надо, расслабься». Принцип является одной из важнейших практик в C++.
В простых случаях инициализация констант не вызывает проблем:
Но что делать, если для вычисления значения константы требуется несколько шагов, временные переменные, циклы или условия?
Традиционные подходы — вынести логику в отдельную именованную функцию или отказаться от const
— не всегда идеальны. Создание отдельной функции может быть избыточным, если логика используется только один раз. Отказ от const
снижает безопасность и выразительность кода.
Здесь на помощь приходит использование немедленно вызываемого лямбда-выражения (IILE). Мы определяем лямбда-функцию, которая инкапсулирует всю сложную логику инициализации, и тут же вызываем её. Результат этого вызова и присваивается нашей константе.
Как это выглядит:
То есть мы можем проинициализировать сложный объект и сохранить константность:
Инкапсуляция: вся логика инициализации собрана в одном месте.
Локальность: временные переменные, используемые для вычисления, не "загрязняют" внешнюю область видимости.
const
сorrectness: позволяет объявить переменную как const
(или даже constexpr
, если лямбда соответствует требованиям), даже если её вычисление многоэтапное.
Чистота кода: избавляет от необходимости создавать отдельные, одноразовые именованные функции.
В C++17 можно использовать std::invoke
, хотя для IILE прямой вызов ()
обычно предпочтительнее и понятнее:
Скобочки форева Последние круглые скобки ()
после фигурных скобок лямбды — это и есть немедленный вызов. Они заставляют лямбду выполниться прямо в месте определения.