Есть ли какая-либо значимая разница между этими двумя в этом случае (я вспоминаю компиляцию, выводящую, что - в любом случае - значение не изменяется и фактически жестко кодирует 42 в результирующем цикле / развернутом цикле / любом другом коде) или делает это дошли до личного вкуса?
В коде, указанном вами, не будет никакой разницы в коде.
Однако, разница в том, что переменная constexpr
гарантирует, что значение известно во время компиляции. См. Ответ @ VittorioRomeo.
Также полезно написать constexpr
, если это действительно значение времени компиляции, для целей документирования: когда кто-то читает ваш код и видит constexpr
, они автоматически знают, что это действительно фиксированное значение. Это важно в случае, если инициализация нетривиальна (например, вызов функции).
Вы также можете видеть constexpr
переменные как истинную замену макросов C, которые содержат литералы (например, #define FOO 123
).
Наконец, помните, что constexpr
подразумевает const
.
В смежном вопросе: что, если бы магическое число (и то, что его заменяет) было объявлено в заголовочном файле вместо файла .ccp - это изменило бы вещи?
Нет. Однако, если вы объявляете глобальные переменные в заголовочном файле, вы, вероятно, захотите использовать inline
(доступно в C ++ 17) поверх constexpr
, чтобы в программе была только одна сущность, которая преимущество, позволяющее избежать проблем с ODR и, возможно, сэкономить память и время инициализации.
См. Должны ли переменные `const` и` constexpr` в заголовках быть `inline` для предотвращения нарушений ODR? для получения дополнительной информации.