Перенос предложения: голоса +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-контекста.
Перенос предложения: голоса +8, -1 Автор идеи: edc0a91c24342ae88891
constexpr - не как константа времени компиляции, а как константа времени исполнения. Либо, снять ограничения с constexpr.
С constexpr существует проблема, которая постоянно мешает. Выражается она в том, что constexpr - есть просто константное выражение времени компиляции.
Предлагаю ввести новое понятие, либо изменить старое. constexpr - есть не КОНСТАНТНОЕ выражение, а просто выражение уровня компиляции, которое относительно рантайма является константой, и только относительно него.
Пример. constexpr auto a = 10; a = 20; - это должно работать, а в рантайм "a" должна попадать как константа со значением 20. Думаю, не нужно разъяснять разницу между константной и не константой.
Похожее поведение существует в constexpr-функциях, но это не выглядит как решения. Выглядит как костыль. Т.е. как constexpr мы можем получить только возвращаемое значение, а самое тело, даже в рамках вызова в constexpr-контексте - не является constexpr, ведь constexpr-функция может вызываться не только в constexpr-контексте.
Тут, вроде как, нет особых технических сложностей относительно текущего решения, но - это решит множество проблем. Применений очень много. Начиная от обходов таппла через for на счётчиках, заканчивая компилтайм-счётчиками.
Частичное решение - сделать (full)constexpr-фуннкции. Т.е. раз контекст не влияет на семантику функции, то нужно просто запретить её вызовы вне constexpr-контекста.