? Попадет ли это в С++26 стандарт? Это наверная самая большая фича которая полностью поменяет метопрограммирование в С++ и уберет необходимость в библиотеках вроде Boost.Hana
Как по мне, для метапрограммирования самым большим изменением послужит рефлексия
Нет, в таком виде не попадёт. Она что-то фундаментальное ломает в устройстве компиляторов
да там не только в компиляторах же ломается invoke_result сломается
А можно подробнее? Что за проблема и где про нее можно почитать? Этот пропозал уже где-то обсуждался?
Обсуждали. Проблема в том что foo(constexpr 42) эквивалентна по смыслу foo<42>(), однако из foo(42) компилятору это сложно понять. В итоге приходится сильно менять имплементацию, ощутимо замедляется время компиляции и потребление памяти Поэтому non type template parameters, вместо constexpr параметров
может просто тип тег ввести для таких параметров?
Так nttp же проще, и тег городить не надо
https://stackoverflow.com/questions/59422612/structural-types-as-nttp-why-must-all-members-be-public
из одного foo(42) это действительно сложно понять, ведь foo может быть именем типа и тогда это вообще не вызов функции поэтому компилятор использовал бы знание о том как foo декларирован и увидел бы там, что 1й параметр помечен constexpr также как сейчас в foo<42>() он использует это, чтобы понять, что <42> это параметры шаблона, а не "оператор меньше, 42, оператор больше"
а в конструкторах что делать?
по новому типу на параметр
последний раз я нечто подобное делал через тег с конструктором, получилось как-то так: Foo bar; FunctionPtr<void()> f(bar, FnTag<&Foo::Buz>);
Там чуть по иному. У компилятора типы не инт, буул, т п, а инт::0 инт::1 инт::-unknown- и так со всеми типами Так вот - чтобы оперировать новым типом инт::42 его нужно "завести в систему", а это делается внутри скобок template<°°°>
поэтому через constexpr параметр "эквивалентный по смыслу шаблонному" оно вдруг существенно сложнее вводится чем через NTTP даже если их прям реально внутри через те же механизмы, что и NTTP проводить? всё ещё не понятно в чём проблема
Новые синтаксические конструкции намного легче, и даже единственно безопасно, вводить в новых конструкциях языка Легаси..с.. Поэтому если и введут, то скажем в лямбдах. Там точно код win3.11 не поломается.
ну т.е. если условно сказать "это работает только в функциях с trailing return type syntax" то вдруг пуф и проблем в реализации нет, потребление памяти время компиляции вернулось к ожидаемым показаниям?
Откровенно не понимаю почему говорится о времени компиляции. На взгляд с моей маленькой кочки зрения большая проблема доказать, что то что в новом режиме компилятор вывел эквивалентно коду, который он раньше емитил.
Обсуждают сегодня