Являются ли значения в enum class constexpr?
Если при объявлении enum class (или просто enum) задать переменным значения через какие-то действия (сложение, вычитание и тд.), то будут ли они вычислены один раз на этапе компиляции?
enum class Foo {
a = 20,
b = a * 20,
c = b + 1
};
Ответы (1 шт):
Да.
Похоже, что если где-то можно использовать только constexpr выражение (а это легко проверить экспериментально), то это выражение всегда вычисляется на этапе компиляции.
Для сравнения, вызов constexpr-функции, если результат не требуется во время компиляции, запросто может быть выполнен в рантайме, если оптимизации выключены.
Но, конечно, стандарт тут ничего не гарантирует, и формально компиляторы могут делать что угодно, потому что понять по поведению программы разницу никак нельзя (as-if rule). Но все компиляторы, которые я проверил, ведут себя так, как я написал выше.