С++ 11 позволяет использовать функции, объявленные с помощью спецификатора constexpr
, в постоянных выражениях, таких как аргументы шаблона. Существуют строгие требования к тому, что разрешено constexpr
; по существу такая функция инкапсулирует только одно подвыражение и ничего больше. (Изменить: это расслаблено в С++ 14, но вопрос стоит.)
Зачем требовать ключевое слово? Что получается?
Это помогает выявить намерение интерфейса, но не подтверждает этого намерения, гарантируя, что функция может использоваться в постоянных выражениях. После написания функции constexpr
программист должен:
- Напишите тестовый пример или иным образом убедитесь, что он действительно используется в постоянном выражении.
- Укажите, какие значения параметров действительны в контексте константного выражения.
Вопреки раскрытию намерения, функции украшения с помощью constexpr
могут добавить ложное чувство безопасности, поскольку тангенциальные синтаксические ограничения проверяются при игнорировании центрального семантического ограничения.
Короче: Может ли быть нежелательный эффект на языке, если constexpr
в объявлениях функций просто необязательно? Или будет ли вообще эффект какой-либо действующей программы?