cpp-ru / ideas

Идеи по улучшению языка C++ для обсуждения
https://cpp-ru.github.io/proposals
Creative Commons Zero v1.0 Universal
89 stars 0 forks source link

Убедить международный комитет не дублировать все контейнеры стандартной библиотеки #304

Closed apolukhin closed 3 years ago

apolukhin commented 3 years ago

Перенос предложения: голоса +16, -0 Автор идеи: yndx-antoshkka

Есть предложение по созданию constexprvector. Идея хорошая, но потенциально выльется в дублирование всех контейнеров стандартной библиотеки с припиской constexpr.

Стоит показать альтернативы такому подходу.

В std::constexpr_vector предлагается сделать специальный контейнер, который сможет аллоцировать память в константных выражениях и который можно будет использовать только в constexpr функциях только если они в constexpr контексте.

Идея отличная, но потенциально выльется в дублирование всех контейнеров стандартной библиотеки с припиской constexpr_.

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

Предложение: "Changing attack vector of the constexpr_vector" http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2017/p0639r0.html

apolukhin commented 3 years ago

zamazan4ik@tut.by, 3 мая 2018, 16:55 А разве ещё не убедили избежать дублирования?

yndx-antoshkka, 3 мая 2018, 17:14 Убедили. Поэтому у задачи тег "сделано в РГ21"

edc0a91c24342ae88891, 18 мая 2018, 5:34 yndx-antoshkka, а есть какие-то подвижки в сторону "снятия константности" с constexpr?

yndx-antoshkka, 18 мая 2018, 12:46 Надо писать бумагу с подробностями. Опишите где это мешает, что хочется починить. Пока кажется что комитет идею отбросит, как ломающую обратную совместимость

edc0a91c24342ae88891, 28 мая 2018, 14:22 yndx-antoshkka, Я уже описал основные моменты в предложении, да и тут множество костылей на эту тему существует: https://stdcpp.ru/proposals/f0075759-68a5-47e4-b39b-8cfc76c33448 , if constexpr, https://stdcpp.ru/proposals/3bf4d05f-e934-4e0e-a1f9-c46b44341980 - моё предложение.

Хорошо, я накидаю примеров. Их миллионы и они очевидны - тот же constexpr счётчик. Нужность его сложно переоценить. Тот же constexpr for выше.

languagelawyer, 1 июня 2018, 13:28

Убедили. Поэтому у задачи тег "сделано в РГ21"

А когда убедили? Идеи разрешить new в константных выражениях (что позволит сделать constexpr аллокаторы и следовательно constexpr контейнеры) гуляют года с 13-го.

yndx-antoshkka, 1 июня 2018, 20:30 languagelawyer, идея гуляла. Один из разработчиков компиляторов в течение 2х лет пытался реализовать эту идею и хороший результат не получил. После чего решил сосредоточиться на создании специального constexpr контейнера. Данный путь в дальнейшем вёл к дублированию всех контейнеров и классов с приставкой constexpr.

В итоге в бумаге мы показали, что можно обойтись только constexpr аллокатором и добавлением constexpr к имеющимся контейнерам. Посмотрев на код аллокатора, разработчик нашёл для себя фишку: можно заставить аллокатор сразу конструировать нужный тип данных при аллокации. Это избавляет от основной проблемы - слежением в constexpr контексте за типом (который erased при возвращении алокатором void/char) и временем жизни type erased объекта.

Дальнейшие изыскания позволили разработчику пойти дальше и сделать constexpr new вместо constexpr_allocator. Такой new просто оставляет за бортом все type erased случаи и не считает их constexpr (этого достаточно для создания constexpr контейнеров, как было показано в бумаге от РГ21).

languagelawyer, 2 июня 2018, 10:44

можно заставить аллокатор сразу конструировать нужный тип данных при аллокации

И насколько это совместимо с требованиями к аллокаторам?

yndx-antoshkka, 13 июня 2018, 12:12 languagelawyer, это ещё предстоит обсудить. Возможно, что вместо использования std::allocator контейнеры будут допатчены std::is_constexpr_evaluated(). Это уберёт зависимость на std::allocator (что обрадует embedded разработчиков) но добавит немного кода в стандартные контейнеры