Не гарантируется, что постоянные выражения будут вычислены во время компиляции, у нас есть только ненормативная цитата из чернового стандартного раздела C ++ 5.19
Постоянные выражения, в котором говорится следующее:
[...]> [Примечание: постоянные выражения можно оценивать во время перевода. — конец примечания]
Вы можете присвоить результат constexpr
переменной, чтобы убедиться, что он оценивается во время компиляции, мы можем видеть это из справочника Бьярна Страуструпа по C ++ 11, в котором говорится ( выделено мной ):
Помимо возможности оценивать выражения во время компиляции, мы хотим иметь возможность требовать вычисления выражений во время компиляции; constexpr перед определением переменной делает это (и подразумевает const):
Например:
constexpr int len1 = length("abcd") ;
Бьярн Страуструп кратко описывает, когда мы можем гарантировать оценку времени компиляции в этой записи блога isocpp, и говорит:
[...] Правильный ответ - как указано Хербом - заключается в том, что согласно стандарту функция constexpr может оцениваться во время компиляции или во время выполнения, если она не используется как постоянное выражение, и в этом случае она должна быть оценена при компиляции -время. Чтобы гарантировать оценку во время компиляции, мы должны либо использовать его там, где требуется постоянное выражение (например, как привязка массива или как метка case), либо использовать его для инициализации constexpr. Я надеюсь, что ни один уважающий себя компилятор не упустит возможность оптимизации сделать то, что я изначально сказал: «Функция constexpr оценивается во время компиляции, если все ее аргументы являются постоянными выражениями».
Таким образом, здесь выделяются два случая, когда его следует оценивать во время компиляции:
- Используйте его там, где требуется постоянное выражение, это может быть где-нибудь в черновике стандарта, где используется фраза
shall be ... converted constant expression
или shall be ... constant expression
, например, привязка к массиву.
- Используйте его для инициализации a,
constexpr
как я обрисовал выше.