Последнее обновление:2026-10-12
Лямбда-выражения в C++20 (часть 1)¶
Шаблоны lambda в C++20¶
C++14 поддерживает обобщённые лямбда-выражения, что позволяет лямбде принимать параметры произвольных типов, например:
Оно разворачивается в:
struct Func {
template <typename T1, typename T2>
auto operator()(T1 a, T2 b) const {
return a + b;
}
};
Однако невозможно получить следующие варианты разворота:
Первый: одинаковые типы
Второй: только std::array
Третий: без выведения
Лямбды C++14 хороши, но C++20 позволяет легко реализовать и эти случаи. C++20 разрешает лямбда-выражениям использовать шаблонные типовые параметры в определении; базовый синтаксис таков:
Далее на нескольких примерах покажем, в чём выгода.
1.Ограничение типа¶
В примере наподобие приведённого ниже в C++14 мы могли бы написать такой код, однако при использовании передаваемое внутрь значение — не обязательно vector, и тогда поведение будет отличаться от ожидаемого, что приведёт к ошибкам.
После C++20 мы можем ограничить тип:
Тогда вопрос — интервью-задача: знаете ли вы, как в C++14 ограничиться vector'ом и при этом гарантировать безопасность?
2.Идеальная передача (perfect forwarding)¶
В C++20 вы можете очень легко использовать идеальную передачу, например:
Тогда вопрос: в чём преимущество по сравнению с C++14? Или иначе: что нужно было делать для реализации идеальной передачи в C++14?
На этом раздел закончен
Похожие темы¶
- Введение в корутины C++20 | C++那些事
- Практика с channel в C++20 | C++那些事
- Концепции Concepts в C++20 | C++那些事
- constexpr и оператор «запятая» в C++20 | C++那些事
- Порядок байтов endian в C++20 | C++那些事
- Модули Modules в C++20 | C++那些事
- Библиотека Ranges в C++20 | C++那些事
- Дизайн и подводные камни std::span в C++20 | C++那些事
- Обзор новых возможностей C++20 | C++那些事
- [[likely]] и [[unlikely]] в C++20 | C++那些事