Подтвердить что ты не робот

Constexpr - почему просто оператор возврата?

Функция constexpr должна состоять только из оператора return и каждый аргумент должен быть известен во время компиляции:

// constexpr functions use recursion rather than iteration
constexpr int factorial(int n)
{
    return n <= 1 ? 1 : (n * factorial(n-1));
}

Почему только оператор return? Я имею в виду, почему это неправильно?

// constexpr functions use recursion rather than iteration
constexpr int factorial(int n)
{
    int a = 222; //another variable
    return n <= 1 ? 1 : (n * factorial(n-1));
}
4b9b3361

Ответ 1

Это упрощает реализацию, как говорит Энди Проул. Возможно, это ответ "Почему", но он не говорит, как он это делает.

Функция с только возвращаемым значением, а более конкретно, без локальных переменных, является особой ситуацией для компилятора. Эта функция теперь состоит из одного выражения: для функции AST требуется только один корень. Отсутствие переменных означает, что это выражение может быть оценено без полноценной виртуальной машины для его обработки, а может использоваться простой оценщик выражений дерева. По разным причинам компилятор, вероятно, уже имеет такого оценщика или может создать один относительно легко (он становится проходом упрощения дерева).

Зная, что в выражении используется только constexpr, также обеспечивается упрощение ключа. Это гарантирует, что каждая вершина в функции AST обладает теми же свойствами, даже если она является вызовом функции. Весь механизм constexpr представляет собой обобщенную форму const-folding. И хотя это не всегда делается на этом высоком уровне в компиляторе, это гарантирует, что он может быть реализован без огромных усилий (по сравнению с полной виртуальной машиной).

Вернемся к вопросу "почему". Ограничение связано главным образом с ограничениями ресурсов для поставщиков. Эта особенность, как указано, не является огромным усилием, и поэтому поставщики могут реально реализовать ее в разумные сроки. Если бы таких ограничений не было, в частности, допускающих локальные переменные, это значительно увеличило бы объем работы. С точки зрения пользователя (мы, программисты) ограничения, однако, совершенно произвольны.

Ответ 2

Почему:

Потому что constexpr - довольно новая и радикальная концепция в С++ 11, и трудно перевести основной языковой стандарт на нечто совершенно новое. Правила консерватизма.

Для С++ 1y (в настоящее время для С++ 14) ваш пример является законным. Совет туловища уже реализует его под флагом -std=c++1y.