Как вы, вероятно, знаете, в C++11 введено ключевое слово constexpr
.
В C++11 введено ключевое слово constexpr, которое позволяет пользователю гарантировать, что функция или конструктор объекта является компилируемой константой. [...] Это позволяет компилятору понять и проверить, что [имя функции] является константой времени компиляции.
Мой вопрос заключается в том, почему существуют такие строгие ограничения на форму функций, которые могут быть объявлены. Я понимаю желание гарантировать, что функция является чистой, но подумайте вот о чем:
Использование constexpr в функции накладывает некоторые ограничения на то. что эта функция может делать. Во-первых, функция должна иметь непустотный возвращаемый тип. Во-вторых, тело функции не может объявлять переменные или определять новые типы. В-третьих, тело функции может содержать только объявления, нулевые утверждения и единственный оператор возврата. Должны существовать такие значения аргументов что после подстановки аргументов выражение в выражении return дает константное выражение.
Это означает, что эта чистая функция является незаконной:
constexpr int maybeInCppC1Y(int a, int b)
{
if (a>0)
return a+b;
else
return a-b;
//can be written as return (a>0) ? (a+b):(a-b); but that isnt the point
}
Также вы не можете определять локальные переменные... :( Мне интересно, это решение разработчиков, или компиляторы не умеют доказывать, что функция a является чистой?