- PVSM.RU - https://www.pvsm.ru -
C++20 прошёл все бюрократические инстанции и теперь официально готов! Международный комитет переехал в онлайн, и теперь мы вовсю работаем над C++23. Под катом вас ждут:
Ура! РГ21 [1] вместе с Fails [2] протащили в стандарт 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 [3].
Кстати, обсуждается идея о том, чтобы исключения C++ при выставлении рантайм-флага могли сохранять трейсы. Разумеется, всё должно быть в лучших традициях C++ — без слома ABI, максимально эффективно, с возможностью не платить за неиспользуемую функциональность.
Если вы не любите печатать std::size_t или std::ssize_t, то вам приглянутся суффиксы C++2b, uz и z соответственно:
for (auto i = 0uz; i < vec.size(); ++i) {
assert(i == vec[i].size());
}
Должен признать, что это нововведение из P0330R8 [4] меня не особо будоражит… Так что перейдём к следующей новинке.
К C++20 успели отрефакторить описание стандартной библиотеки, явно разделив static_assert, SFINAE и рантайм условия для классов и функций. К C++23 подгруппа ядра языка решилась переработать часть стандарта, отвечающую за декларации и их поиск.
В итоге закрыли 61 ошибку в ядре языка, частично решили ещё четыре проблемы. Любители артхаусной литературы могут оценить новый слог в P1787R6 [5].
Долой str.find(str2) != std::string_view::npos! Теперь, благодаря P1679R3 [6], можно писать более вменяемый код str.contains(str2). Лично меня весьма радует, что с C++20 люди в комитете активно работают над красотой и лаконичностью языка, отодвинув концепцию итераторов и позиций на второй план:
Было | Стало |
---|---|
|
|
|
|
|
|
Увы, но Executors всё ещё не приняли в стандарт.
Однако комитет сдвинулся с мёртвой точки! Интерфейс практически устаканился, P0443 [7] почти готов к принятию. Появилось множество реализаций предложенного интерфейса:
Работа над Networking идёт одновременно с Executors, постоянно вносятся небольшие правки. Networking продолжает зависеть от Executors, есть шанс, что успеют сделать обе вещи к C++23.
В ближайшие полтора года международный комитет планирует работать удалённо. Планы на C++2b остаются в силе — выпустить новый стандарт в 2023 году.
Конференции по C++ тоже продолжаются в онлайн-формате, ближайшая — С++ meetup Moscow #11 [13] в Технопарке Сколково. Следите за новостями и анонсами в канале t.me/ProCxx [14].
Напоследок ещё немного приятных новостей: в рамках подготовки к выпуску userver [15] мы начали актвнее апстримить наши таксишные наработки в смежные проекты. segoon [16] уже успел заапстримить в clang-tidy-проверку на безопасность функции для многопоточных приложений [17]. Надеюсь, вам пригодится!
Автор: Antony Polukhin
Источник [18]
Сайт-источник PVSM.RU: https://www.pvsm.ru
Путь до страницы источника: https://www.pvsm.ru/programmirovanie/359529
Ссылки в тексте:
[1] РГ21: https://stdcpp.ru/
[2] Fails: https://habr.com/ru/users/fails/
[3] P0881R7: https://wg21.link/P0881R7
[4] P0330R8: https://wg21.link/P0330R8
[5] P1787R6: https://wg21.link/P1787R6
[6] P1679R3: https://wg21.link/P1679R3
[7] P0443: https://wg21.link/P0443
[8] github.com/executors/executors-impl: https://github.com/executors/executors-impl
[9] github.com/facebookexperimental/libunifex: https://github.com/facebookexperimental/libunifex
[10] github.com/jaredhoberock/cusend: https://github.com/jaredhoberock/cusend
[11] github.com/jaredhoberock/cuex: https://github.com/jaredhoberock/cuex
[12] github.com/chriskohlhoff/propria: https://github.com/chriskohlhoff/propria
[13] С++ meetup Moscow #11: https://www.meetup.com/ru-RU/Moscow-C-User-Groups/events/274653685
[14] t.me/ProCxx: https://t.me/ProCxx
[15] userver: https://habr.com/ru/company/yandex/blog/474438/
[16] segoon: https://habr.com/ru/users/segoon/
[17] безопасность функции для многопоточных приложений: https://reviews.llvm.org/D90944
[18] Источник: https://habr.com/ru/post/527938/?utm_source=habrahabr&utm_medium=rss&utm_campaign=527938
Нажмите здесь для печати.