В 2026 году собеседующие ждут, что вы пишете хотя бы на C++20 и знаете, что принёс C++23 (стандарт ISO/IEC 14882:2024). Ниже главное, о чём спрашивают.
Большая четвёрка C++20
- Концепты (
<concepts>): именованные требования к шаблонным параметрам, понятные ошибки (см. модуль про шаблоны). - Ranges (
<ranges>): алгоритмы, принимающие контейнер целиком, проекции и ленивые представленияviews::filter,views::transform,views::take. - Корутины: функции, которые могут приостанавливаться (
co_await), выдавать значения (co_yield) и возвращать результат (co_return). Корутины C++ бесстековые: состояние хранится в кадре в куче (компилятор может убрать аллокацию). Стандарт дал только механизм, а типы задач и генераторов пишут сами или берут из библиотек; в C++23 появилсяstd::generator. - Модули:
export module math;иimport math;вместо#include. Модуль компилируется один раз, макросы не протекают, сборка быстрее. Поддержка в компиляторах и CMake (3.28+) уже рабочая, но экосистема переходит постепенно.
Удобства C++20
- Оператор «космический корабль»
<=>:auto operator<=>(const T&) const = default;генерирует все сравнения почленно в порядке объявления полей. Вместе с ним по умолчанию объявляется==. - Назначенные инициализаторы:
Point p{.x = 1, .y = 2};(поля в порядке объявления). std::format: типобезопасное форматирование в стиле Python:std::format("{:>8.2f}", price).std::span,std::jthreadиstd::stop_token,std::bit_cast,<bit>(popcount,has_single_bit), календарь и часовые пояса в<chrono>.consteval(функция обязана вычисляться при компиляции),constinit(переменная обязана инициализироваться статически),constexprдляstd::vectorиstd::stringвнутри вычислений.containsу ассоциативных контейнеров,starts_withиends_withу строк,std::erase_if,std::ssize.
C++23
std::expected<T, E>: результат или ошибка без исключений.std::printиstd::println(<print>): вывод с форматированием прямо в поток.- Deducing this: явный объектный параметр
void f(this Self&& self). Убирает дублированиеconstи не-constперегрузок, даёт рекурсивные лямбды и CRTP без шаблонной базы. std::flat_mapиstd::flat_set: ассоциативные контейнеры на отсортированных векторах.std::mdspan: многомерное представление над непрерывной памятью.- Ranges пополнились:
views::zip,views::enumerate,views::chunk,ranges::to<std::vector>(). std::move_only_function,std::unreachable(),if consteval, многомерныйoperator[].
Поддержка C++23 в GCC 14 и Clang 18-19 почти полная по языку, а библиотечные части приходят постепенно (например, std::flat_map в libstdc++ появился позже). Перед использованием проверяйте свою версию: макросы __cpp_lib_* из <version> говорят, что реализовано.
Что было раньше и всё ещё спрашивают
- C++17: структурные привязки
auto [key, value] = *it;,std::optional,std::variantиstd::visit,std::string_view,if constexpr,if (init; cond), свёртки, гарантированный пропуск копирования,std::filesystem. - C++14: generic-лямбды,
std::make_unique,autoв возвращаемом типе.
Частые ошибки
- Использовать
std::string_viewили представление ranges, пережившее данные. - Ждать, что
= defaultдля<=>сравнит поля в нужном вам порядке: сравнение идёт в порядке объявления. - Считать корутины потоками: они не создают параллелизма сами по себе.
- Тянуть в проект возможности C++23, не проверив поддержку компилятором на всех платформах.
Что спросят на собесе
- Что вошло в C++20 и чем это помогает в реальном коде.
- Как работает
<=>и что генерирует= default. - Что такое корутины в C++ и чем они отличаются от потоков.
- Зачем модули и почему они ещё не везде.
- Что вы используете из C++23:
expected,print, deducing this.