Expressions and statements
ES.28
Используйте лямбды для сложной инициализации, особенно переменных `const`
Причина
Это аккуратно инкапсулирует локальную инициализацию, включая очистку вспомогательных переменных, нужных только для инициализации, без необходимости создавать лишнюю нелокальную, но не переиспользуемую функцию. Это также работает для переменных, которые должны быть const, но только после выполнения некоторой инициализирующей работы.
Пример (плохой)
widget x; // должна быть const, но:
for (auto i = 2; i <= N; ++i) { // это мог бы быть какой-то
x += some_obj.do_something_with(i); // произвольно длинный код
} // необходимый для инициализации x
// отсюда x должна быть const, но мы не можем это указать в коде такого стиля
Пример (хороший)
const widget x = [&] {
widget val; // предполагаем, что widget имеет конструктор по умолчанию
for (auto i = 2; i <= N; ++i) { // это мог бы быть какой-то
val += some_obj.do_something_with(i); // произвольно длинный код
} // необходимый для инициализации x
return val;
}();
По возможности сводите условия к простому набору альтернатив (например, enum) и не смешивайте выбор и инициализацию.
Контроль
Сложно. В лучшем случае — эвристика. Ищите неинициализированную переменную, за которой следует цикл, присваивающий ей значение.