Должен ли я всегда заменять "const int" на "constexpr int" на С++ 11, когда это возможно?

Вы заменили бы

const int one = 1;
const int two = 2;

с этим?

constexpr int one = 1;
constexpr int two = 2;

Насколько я понимаю, что оба блока семантически идентичны и что в настоящее время это просто вопрос вкуса?

С другой стороны, поскольку constexpr подразумевает const, вы можете утверждать, что более последовательно всегда предпочитать более ограничительную форму, даже в тривиальных ситуациях, где это не имеет значения?

(Я понимаю, что ситуация полностью меняется, когда выражение на правой стороне разрешено быть более сложным. Поэтому для пояснения вопрос фокусируется только на самом простом случае, когда выражение является фиксированным целым числом.)

Ответ 1

Я думаю, что ваше утверждение о том, что const и constexpr "семантически идентичны" должно быть пересмотрено: они оба объявляют объекты, значение которых не может измениться, но constexpr также требует, чтобы выражение инициализатора было вычислимым во время компиляции.

Теперь, если выражение в правой части не может быть вычислено во время компиляции, использование constexpr не может быть и речи. С другой стороны, до тех пор, пока инициализатор является литералом, вы можете использовать constexpr, но учтите, что такое семантика вашей переменной: действительно ли ваша постоянная переменная представляет что-то, чье значение должно быть вычислимым во время компиляции?

В оптике поддержки/эволюции ПО, возможно, вы измените способ инициализации своей переменной в течение всего времени: сегодня инициализатор является литералом, завтра это может быть более сложное выражение.

Независимо от того, как вы теперь назначаете ему значение, считаете ли вы, что i когда-либо понадобится инициализировать чем-либо иначе, чем литерал, и что инициализирующее выражение не может быть вычислимым во время компиляции? Если это так, то просто создайте переменную const, даже если вы в настоящее время инициализируете ее литералом; в противном случае сделайте это constexpr.

Другими словами, выберите классификатор, который наилучшим образом выражает семантику вашей переменной.