Основная проблема заключается в том, что функции constexpr
по определению предназначены для вызова во время компиляции , а также во время выполнения.Давайте начнем с более простого примера:
constexpr int f(int n) { return n };
int n = 7;
// n could be modified!
f(n); // compiler cannot know which value n has at runtime,
// so the function needs to be executed at runtime as well!
f(7); // well, now right the opposite...
Так что все довольно просто: результат функции constexpr
равен constexpr
, тоже , если и только если все аргументы, с которыми вызывается функция, сами constexpr
(и только в этом случае функция оценивается во время компиляции), в противном случае это будет значение времени выполнения (а функция оценивается во время выполнения).
Внутри constexpr
функций, однако, компилятор не может знать, вызвана ли функция только с constexpr
аргументами или нет;поэтому параметры функции всегда необходимо считать не-1022 *.И вот мы ...
(Конечно, make_string
даже не constexpr
, но если constexpr
нельзя допустить для параметров функций constexpr
, то еще меньше для параметров нормальной функции...)