Ответ 1
Я думаю, что ваше утверждение о том, что const
и constexpr
"семантически идентичны" должно быть пересмотрено: они оба объявляют объекты, значение которых не может измениться, но constexpr
также требует, чтобы выражение инициализатора было вычислимым во время компиляции.
Теперь, если выражение в правой части не может быть вычислено во время компиляции, использование constexpr
не может быть и речи. С другой стороны, до тех пор, пока инициализатор является литералом, вы можете использовать constexpr
, но учтите, что такое семантика вашей переменной: действительно ли ваша постоянная переменная представляет что-то, чье значение должно быть вычислимым во время компиляции?
В оптике поддержки/эволюции ПО, возможно, вы измените способ инициализации своей переменной в течение всего времени: сегодня инициализатор является литералом, завтра это может быть более сложное выражение.
Независимо от того, как вы теперь назначаете ему значение, считаете ли вы, что i
когда-либо понадобится инициализировать чем-либо иначе, чем литерал, и что инициализирующее выражение не может быть вычислимым во время компиляции? Если это так, то просто создайте переменную const
, даже если вы в настоящее время инициализируете ее литералом; в противном случае сделайте это constexpr
.
Другими словами, выберите классификатор, который наилучшим образом выражает семантику вашей переменной.