Являются ли значения в enum class constexpr?

Если при объявлении enum class (или просто enum) задать переменным значения через какие-то действия (сложение, вычитание и тд.), то будут ли они вычислены один раз на этапе компиляции?

enum class Foo {
  a = 20,
  b = a * 20,
  c = b + 1
};

Ответы (1 шт):

Автор решения: HolyBlackCat

Да.

Похоже, что если где-то можно использовать только constexpr выражение (а это легко проверить экспериментально), то это выражение всегда вычисляется на этапе компиляции.

Для сравнения, вызов constexpr-функции, если результат не требуется во время компиляции, запросто может быть выполнен в рантайме, если оптимизации выключены.

Но, конечно, стандарт тут ничего не гарантирует, и формально компиляторы могут делать что угодно, потому что понять по поведению программы разницу никак нельзя (as-if rule). Но все компиляторы, которые я проверил, ведут себя так, как я написал выше.

→ Ссылка