Как вы, наверное, знаете, С++ 11 представляет ключевое слово constexpr
.
С++ 11 вводит ключевое слово constexpr, которое позволяет пользователю гарантировать, что конструктор функции или объекта является временем компиляции постоянная. [...] Это позволяет компилятору понять и проверить, что [имя функции] является константа времени компиляции.
Мой вопрос: почему существуют такие строгие ограничения на форму функций, которые могут быть объявлены. Я понимаю желание гарантировать, что функция чиста, но учтите следующее:
Использование constexpr для функции накладывает некоторые ограничения на то, что эта функция может сделать. Во-первых, функция должна иметь непустой возврат тип. Во-вторых, тело функции не может объявлять переменные или определять новые типы. В-третьих, тело может содержать только объявления, нулевые утверждения и один оператор возврата. Должны существовать значения аргументов, такие как что после замены аргумента выражение в возврате оператор выражает постоянное выражение.
Это означает, что эта чистая функция является незаконной:
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, является чистым?