Правильный constexpr

edc0a91c24342ae88891
edc0a91c24342ae88891

С 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-контекста.

7
рейтинг
Нет комментариев
Другие идеи
Группа создана, чтобы собирать предложения к стандарту C++, организовывать их внутренние обсуждения, помогать готовить их для отправки в комитет и защищать на общих собраниях в рабочей группе по С++ Международной организации по стандартизации (ISO).
Все предложения