C++20 укомплектован, C++23 начат. Итоги встречи в Кёльне

На днях прошла встреча международного комитета по стандартизации C++ в Кёльне. В прошлый раз был принят feature freeze на C++20, так что комитет должен был обсуждать только исправления уже принятых вещей, а добавлять новинки уже в C++23…

… но всё было не так!

C++20 укомплектован, C++23 начат. Итоги встречи в Кёльне 1

Что сделали с std::flat_map; останутся ли страшные ключевые слова co_return, co_await и co_yield; успели ли доделать std::format; в каком виде будут контракты в C++20? Всё это вас ждёт под катом.

Evolution Working Group

Понедельник

День был насыщенным — решили переименовать все концепты в snake_case вместо CamelCase. Вдобавок с большим перевесом по голосам приняли предложение P1607, которое меняет синтаксис и поведение контрактов на более понятное (но также требующее макросов).

Вторник

Обсуждали корутины. Отклонили всё, включая наше предложение на отбрасывание co_ с ключевых слов для корутин. Увы.

Среда

Внезапно сообразили, что одобренное в понедельник предложение P1607 никто на практике не проверял, обсуждалось оно минут 30, в то время как существующее решение на контракты оттачивалось в течение многих лет.

После длительного обсуждения решили, что контракты в принципе не готовы к C++20. И убрали их из стандарта.

Четверг, пятница

Обсуждали вещи для C++23. Основные силы были сосредоточены на новых механизмах в обработке ошибок. Были как общие размышления на тему, так и конкретные предложения на новый спецификатор исключений throws.

Library Working Group

В комитете есть подгруппа LWG. Любой документ, добавляющий функциональность в стандартную библиотеку, должен пройти ревью в этой подгруппе.

Средняя пропускная способность LWG — ~30 документов в неделю. В Кёльне надо было рассмотреть более 50 документов, среди которых около половины крайне внушительных размеров, например:
* std::flat_map
* std::jthread
* operator<=> для стандартной библиотеки
* Новые примитивы синхронизации
+ из EWG прилетела бумага на переименование концептов в snake_case.

Что из ранее одобренного успели дотащить до C++20

Увы, std::stacktrace, std::flat_map, std::flat_set в C++20 не попали 🙁

С++23

Началась работа над крупными вещами, включая адаптацию Boost.Process для стандарта, переосмысливание работы с файлами и вводом/выводом, линейную алгебру, юникод, 2d графика, аудио, JIT компиляцию C++ кода.

Большая часть вещей будет ещё претерпевать крупные изменения. Ближе всего к принятию std::filesystem::path_view. path_view позволит работать с путями без динамических аллокаций, что является первым шагом к сверхпроизводительной работе с файловой системой.

Заслуги РГ21

Как и всегда, мы работали в различных подгруппах, чинили баги, правили тексты, делились опытом по внедрению, презентовали бумаги, авторы которых не смогли приехать. Так, например, в последний момент заметили и подправили работу std::format с Inf/NaN; убрали неожиданности из интерфейса jthread; протащили через одну из подгрупп предложение на хеширование pair, tuple, string, array.

Много времени провели в подгруппе SG1 Concurrency за обсуждением concurrent_unordered_map. В итоге функции visit теперь не будут защищать переданный value от конкурентной модификации, только от удаления из контейнера:

concurrent_unordered_map<int, std::string> conc_map;
conc_map.visit(42, [](std::string& value) { // да, неконстантная ссылка....
    // Раньше было всегда OK. Теперь OK если другие визиторы не меняют это же value.
    std::cerr << value; 

    // Раньше было всегда OK. Теперь OK если другие визиторы не меняют это же value.
    value += "Hello"; 
});

.
С таким интерфейсом проще стрелять себе в ноги выжать максимум производительности для некоторых статистических задач, при этом синхронизация фактически ложится на плечи пользователя:

concurrent_unordered_map<int, std::atomic<int>> conc_map;
conc_map.visit(42, [](std::atomic<int>& value) { // да, неконстантная ссылка....
    // Всегда OK
    ++ value; 
});

Также есть небольшие подвижки в SG6 Numerics — начали думать над Numerics TS с большим количеством новых классов чисел, в том числе с wide_integer от нас.

Прочее

Осенью в Питере состоится конференция C++ Piter, на которой можно будет лично пообщаться со многими людьми из комитета.

Встреча РГ21 по итогам Кёльнского собрания ISO состоится 9 августа (регистрация обязательна, количество мест ограничено). На встрече можно задать вопросы об интересующих вас новинках и узнать побольше о C++20 и C++23.

Let’s block ads! (Why?)

Читайте также:

Добавить комментарий

Ваш e-mail не будет опубликован. Обязательные поля помечены *