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