- PVSM.RU - https://www.pvsm.ru -
На днях прошла встреча международного комитета по стандартизации C++ в американском городе Кона. Это была не просто встреча, а feature freeze! Никакие серьёзные новые идеи больше не могут просачиваться в стандарт, остаётся лишь пара встреч на добавление предварительно одобренных вещей, исправление недочётов и устранение шероховатостей.
Ожидать ли Модули и Корутины в C++20, будет ли там быстрая библиотека для форматирования вывода, сможет ли она работать с календарями, добавили ли std::stacktrace, начнёт ли компилятор сам вызывать std::move в ряде случаев, приняли ли std::flat_map? Всё это и многое другое ожидает вас под катом.
Самые жаркие дебаты разгорелись вокруг сопрограмм. Комитету предстояло рассмотреть три различных подхода к сопрограммам и решить, принимать в стандарт имеющиеся Coroutines TS, либо идти другим путём.
Выбор был не простой, у каждого подхода есть свои минусы и плюсы:
После долгих дебатов сопрограммы были приняты в C++20 в том виде, в котором они были в Coroutines TS (с co_* префиксами и старыми точками кастомизации).
На обсуждение модулей повлиял один интересный документ с замерами производительности:
P1441R0 [6]. Трактовать результаты можно по разному: от «существующие системы сборки и реализация модулей ещё недостаточно оптимизированы» до «модули плохо масштабируются с ростом сложности проекта».
Помимо этого документа, комитет обсудил ряд небольших правок к текущим модулям. В итоге, спустя 15 лет обсуждения, прототипирования и экспериментов с внедрениями, модули были приняты в C++20.
Good news everyone! Если не найдут фатальных недостатков в подгруппе Library, то в C++20 можно будет безопасно и очень быстро форматировать строки. Скажите «до свидания» std::ios, std::locale и прочим ужасам 90-х! Теперь Python подобный синтаксис для форматирования доступен из коробки в С++: P0645R5 [7].
Более того, было принято предложение на интеграцию нового форматирования и календарных времён P1361R0 [8]. Если всё пойдёт по плану, то и даты можно будет выводить по-человечески!
Executors являются важным кирпичиком для поддержки Networking в C++ из коробки. Для Executors нужны Properties — возможность модифицировать тип данных, в зависимости от параметра переданного на этапе компиляции, не меняя концепт типа.
Properties описаны в P1393R0 [9]. Не смотря на то, что текста для включения в стандарт всего пара страничек, предложение вызвало бурные обсуждения. Предложение позволяет делать практически всесильные точки кастомизации, менять поведение любых функций, использующих Properties.
В итоге решено было Properties включать в язык только в C++23, а соответственно и Executors, и Networking в C++20 не появятся.
В черновик C++20 уже были внесены следующие изменения:
Много других вещей ожидают финального ревью в подгруппах Library и Core, для включения в C++20:
В самый первый день за горячо любимое в Яндекс.Такси предложение на Stacktrace P0881R3 [21] взялась подгруппа Core. Замечания по дизайну были дополнительно обсуждены в подгруппе LEWG, ещё раз проработаны в Core. В итоге в течении всей недели вносились правки и велись обсуждения. В черновик стандарта предложение ещё не включено, но должно оказаться в C++20 (если не найдут вдруг какой-то фатальный недостаток).
До обсуждения нашей идеи P1485R0 [3] на приведение ключевых слов для корутин дело не дошло.
Также в SG1 Concurrency обсуждали идею concurrent unordered map P1485R0 [3]. Нас попросили перепроверить, что предложенное API позволяет избежать reader contention. Также сказали поисследовать concurrent unordered контейнеры, которые не имеют функции erase и не защищают значение контейнера от конкурентной модификации.
Предложение от ZaMaZaN4iK [22] на специализацию std::hash для различных классов стандартной библиотеки P1406R0 [23] решено было сильно порезать. Комитет порекомендовал оставить специализации только для std::pair, std::tuple, std::array и std::basic_string от пользовательских аллокаторов.
В подгруппе цифр SG6 обсудили механизм для взаимодействия различных новых классов чисел P0880R2 [24]. Предложение позволяет специализировать два шаблона, получить полный набор математических операций и сравнений для всех новых типов. По итогам обсуждения решили попробовать расширить механизм, чтобы им можно было пользоваться не только для нужд стандартной библиотеки, но и пользователи могли использовать эти операторы для своих типов.
Также обсуждали наши незначительные предложения, включая feature testing macro P1424R0 [25] и политики на их добавление в стандарт.
Быстро обсудили нашу идею, позволяющую компилятору убирать лишние копирования R0889R1 [26]. Нам сказали продолжать работу в этом направлении и накидали примеров, которые не должны ломаться с новыми правилами.
C++20 будет так же разительно отличаться от C++17, как С++11 отличался от C++03. Огромное количество новых технологий и новых парадигм: Concepts, Contracts, Ranges, Modules, Coroutines, constexpr контейнеры и constexpr динамический полиморфизм, «ниблойды» и т. д.
В скором времени мы, Рабочая Группа 21, [27] отправим комментарии к черновику стандарта C++20. Поэтому, если у вас есть какая-то боль или вы не согласны с каким-то нововведением, пожалуйста, оставляйте свои мысли на этой странице [28].
Следующее собрание международного комитета будет летом, на нём могут начать рассматривать нововведения для C++23. Если вы хотите что-то изменить в C++ или предложить свою идею, то всегда можете написать на https://stdcpp.ru/ [29], где люди из РГ21 помогут вам донести ваши желания до комитета.
Желаете поговорить с нами вживую? Скоро состоится открытая встреча РГ21, следите за анонсами на events.yandex.ru [30]. Так же ищите нас на апрельской конференции C++ Russia [31] в Москве.
Автор: Antony Polukhin
Источник [32]
Сайт-источник PVSM.RU: https://www.pvsm.ru
Путь до страницы источника: https://www.pvsm.ru/programmirovanie/310736
Ссылки в тексте:
[1] N4775: http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2018/n4775.pdf
[2] P1477R0: http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2019/p1477r0.pdf
[3] P1485R0: https://apolukhin.github.io/papers/Better%20keywords%20for%20Coroutines%20TS.html
[4] P1063R2: http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2019/p1063r2.pdf
[5] P1430R0: http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2019/p1430r0.pdf
[6] P1441R0: http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2019/p1441r0.pdf
[7] P0645R5: http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2019/p0645r5.html
[8] P1361R0: http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2019/p1361r0.pdf
[9] P1393R0: http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2019/p1393r0.html
[10] P0960: http://wg21.link/P0960
[11] P0811: http://wg21.link/P0811
[12] P1001: http://wg21.link/P1001
[13] P1227: http://wg21.link/P1227
[14] P0920: http://wg21.link/P0920
[15] P1135: http://wg21.link/P1135
[16] P0429: http://wg21.link/P0429
[17] P1222: http://wg21.link/P1222
[18] P0792: http://wg21.link/P0792
[19] P0533: http://wg21.link/P0533
[20] P0408: http://wg21.link/P0408
[21] P0881R3: http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2019/p0881r3.html
[22] ZaMaZaN4iK: https://habr.com/ru/users/zamazan4ik/
[23] P1406R0: http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2019/p1406r0.html
[24] P0880R2: http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2019/p0880r2.html
[25] P1424R0: http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2019/p1424r0.html
[26] R0889R1: http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2019/p0889r1.html
[27] мы, Рабочая Группа 21,: https://stdcpp.ru/about
[28] на этой странице: https://stdcpp.ru/proposals/e9e9e9f8-8844-4f46-91ff-e517c2b1d66e
[29] https://stdcpp.ru/: https://stdcpp.ru/
[30] следите за анонсами на events.yandex.ru: https://events.yandex.ru/
[31] C++ Russia: http://cppconf.ru/
[32] Источник: https://habr.com/ru/post/438864/?utm_source=habrahabr&utm_medium=rss&utm_campaign=438864
Нажмите здесь для печати.