Урок по треку C++ 5 мин

Современный C++: C++20 и C++23

Модули, корутины, spaceship, ranges, std::format и std::print, std::expected, deducing this.

В 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.

Закрепите за 5 минут

После урока в тренажёре 3-5 проверочных вопросов, дальше модуль уходит в повторения.