cpp-ru / ideas

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

Правильный constexpr #282

Open apolukhin opened 3 years ago

apolukhin commented 3 years ago

Перенос предложения: голоса +8, -1 Автор идеи: edc0a91c24342ae88891

constexpr - не как константа времени компиляции, а как константа времени исполнения. Либо, снять ограничения с constexpr.

С constexpr существует проблема, которая постоянно мешает. Выражается она в том, что constexpr - есть просто константное выражение времени компиляции.

Предлагаю ввести новое понятие, либо изменить старое. constexpr - есть не КОНСТАНТНОЕ выражение, а просто выражение уровня компиляции, которое относительно рантайма является константой, и только относительно него.

Пример. constexpr auto a = 10; a = 20; - это должно работать, а в рантайм "a" должна попадать как константа со значением 20. Думаю, не нужно разъяснять разницу между константной и не константой.

Похожее поведение существует в constexpr-функциях, но это не выглядит как решения. Выглядит как костыль. Т.е. как constexpr мы можем получить только возвращаемое значение, а самое тело, даже в рамках вызова в constexpr-контексте - не является constexpr, ведь constexpr-функция может вызываться не только в constexpr-контексте.

constexpr void f() {

  int a;// a не является constexpr, даже если функция вызывается в constexpr-контексте.

  t<a> // -- не сработает

}

Тут, вроде как, нет особых технических сложностей относительно текущего решения, но - это решит множество проблем. Применений очень много. Начиная от обходов таппла через for на счётчиках, заканчивая компилтайм-счётчиками.

Частичное решение - сделать (full)constexpr-фуннкции. Т.е. раз контекст не влияет на семантику функции, то нужно просто запретить её вызовы вне constexpr-контекста.