C++20 прошёл все бюрократические инстанции и теперь официально готов! Международный комитет переехал в онлайн, и теперь мы вовсю работаем над C++23. Под катом вас ждут:

  • std::stacktrace,
  • z и uz,
  • 61 с половиной багфикс в ядре языка,
  • string::contains,
  • Executors & Networking,
  • и прочие новости.

std::stacktrace


Ура! РГ21 вместе с Fails протащили в стандарт std::stacktrace. Скоро можно будет делать программы с хорошей диагностикой:

#include <stacktrace>

// ...
std::cout << std::stacktrace::current();

И получать читаемый трейс:

0# bar(int) at /path/to/source/file.cpp:70
1# bar(int) at /path/to/source/file.cpp:70
2# bar(int) at /path/to/source/file.cpp:70
3# bar(int) at /path/to/source/file.cpp:70
4# main at /path/to/main.cpp:93
5# __libc_start_main in /lib/x86_64-linux-gnu/libc.so.6
6# _start

Stacktrace незаменим для диагностирования сложных проблем. Он меня много раз спасал при отладке асинхронного кода. Например, в Такси можно включить особый режим работы сервиса, после чего порождение подзадач и исключения начинают печатать трейсы.

Библиотека приехала в стандарт C++ из Boost, но есть отличие в поведении: конструктор по умолчанию для std::stacktrace создаёт пустой объект, а не захватывает trace текущего потока, как это делает boost::stacktrace. Описание интерфейса и особенности дизайна класса доступны в P0881R7.

Кстати, обсуждается идея о том, чтобы исключения C++ при выставлении рантайм-флага могли сохранять трейсы. Разумеется, всё должно быть в лучших традициях C++ — без слома ABI, максимально эффективно, с возможностью не платить за неиспользуемую функциональность.

Z и UZ


Если вы не любите печатать std::size_t или std::ssize_t std::ptrdiff_t, то вам приглянутся суффиксы C++2b, uz и z соответственно:

for (auto i = 0uz; i < vec.size(); ++i) {
      assert(i == vec[i].size());
}

Должен признать, что это нововведение из P0330R8 меня не особо будоражит… Так что перейдём к следующей новинке.

Большой рефакторинг стандарта


К C++20 успели отрефакторить описание стандартной библиотеки, явно разделив static_assert, SFINAE и рантайм условия для классов и функций. К C++23 подгруппа ядра языка решилась переработать часть стандарта, отвечающую за декларации и их поиск.

В итоге закрыли 61 ошибку в ядре языка, частично решили ещё четыре проблемы. Любители артхаусной литературы могут оценить новый слог в P1787R6.

string::contains


Долой str.find(str2) != std::string_view::npos! Теперь, благодаря P1679R3, можно писать более вменяемый код str.contains(str2). Лично меня весьма радует, что с C++20 люди в комитете активно работают над красотой и лаконичностью языка, отодвинув концепцию итераторов и позиций на второй план:
Было Стало
std::string_view{str}.substr(0, str2.size()) == str2
str.starts_with(str2);
str.size() >= str2.size() && !str.compare(
    str.size() - str2.size(),
    std::string_view::npos,
    str2)
str.ends_with(str2);
std::sort(std::begin(d), std::end(d));
std::ranges::sort(d);

Executors & Networking


Увы, но Executors всё ещё не приняли в стандарт.

Однако комитет сдвинулся с мёртвой точки! Интерфейс практически устаканился, P0443 почти готов к принятию. Появилось множество реализаций предложенного интерфейса:


Работа над Networking идёт одновременно с Executors, постоянно вносятся небольшие правки. Networking продолжает зависеть от Executors, есть шанс, что успеют сделать обе вещи к C++23.

Прочие новости


В ближайшие полтора года международный комитет планирует работать удалённо. Планы на C++2b остаются в силе — выпустить новый стандарт в 2023 году.

Конференции по C++ тоже продолжаются в онлайн-формате, ближайшая — С++ meetup Moscow #11 в Технопарке Сколково. Следите за новостями и анонсами в канале t.me/ProCxx.

Напоследок ещё немного приятных новостей: в рамках подготовки к выпуску userver мы начали активнее апстримить наши таксишные наработки в смежные проекты. segoon уже успел заапстримить в clang-tidy-проверку на безопасность функции для многопоточных приложений. Надеюсь, вам пригодится!