Лямбды 2/2.
7. Init capture optimisation.
Если у вас есть какой-то код вроде
std::find_if(v.begin(), v.end(),
[&pref](const auto& s) {
return s == pref + “bar”;
});то вычисление
pref + “bar” будет делаться на каждой итерации. Потому лучше вынести его в список захвата:std::find_if(v.begin(), v.end(),
[str = pref + “bar”](const auto& s) {
return s == str;
});что позволит немного сэкономить на вычислениях.
8. С C++17 лямбды могут быть
constexpr.auto f = []() constexpr {
return sizeof(void*);
};
std::array<int, f()> arr = {};Аналогично с
consteval с C++20. 9. Вот тут можно почитать, как написать удобный хелпер
Overloaded для работы с std::variant и std::visit с помощью наследования от лямбд.10. C С++20 лямбды умеют в конструирование по умолчанию, что помогает не передавать их в места вроде делитеров для умных указателей или как компараторы в конструкторы
std::set/std::map и отдавать только тип в шаблон.11. Забавный факт.
template <auto = []{}>
struct X {};
X x1;
X x2;
static_assert(!is_same_v<decltype(x1), decltype(x2)>);Этот код успешно скомпилируется, т.к. при каждом обращении к типу, используется новое выражение
[]{}, которое имеет абсолютно новый тип относительно прошлых выражений []{}. Соответственно каждый раз шаблон X будет инстанцирован разными типами. И потому типы переменных не совпадают.Например, если у вас часто есть переменные, которые нужны только для получения сайдэффектов их конструктора, вам нужно сгенерировать некоторое уникальное имя. Тут и может пригодиться подобное.
UPD.
Почему-то потерялся линк на оригинал, откуда взял часть инфы.
Доклад Тимура Думлера на CppCon 2022.