Переменная Constexpr не является значением времени компиляции? - PullRequest
3 голосов
/ 11 ноября 2019

Согласно https://docs.microsoft.com/en-us/cpp/cpp/constexpr-cpp?view=vs-2019

"constexpr указывает, что значение или возвращаемое значение является постоянным и, если возможно, вычисляется во время компиляции."

Кроме того, Разница между constexpr и статической глобальной переменной constexpr

"В объявлениях переменных constexpr подразумевает const, а переменная const в области пространства имен по умолчанию имеет внутреннюю связь (поэтому добавлениеstatic ничего не меняет). "

Что, я думаю, означает, что constexpr подразумевает const, что подразумевает static.

Однако ответ на этот вопрос меня смущает: Когда и почему вы используете static с constexpr?

В нем говорится, что

  1. "переменные constexpr не являются значениями времени компиляции"
  2. "Как нам кажется, в некоторых угловых случаях мы можем извлечь выгоду из статической длительности хранения статической переменной constexpr."

Что я неправильно понимаю?

1 Ответ

9 голосов
/ 11 ноября 2019

Чего вам не хватает, так это того, где используется строгая терминология C ++, а где ее нет.

constexpr Переменная не является значением времени компиляции, поскольку она не является значением . Переменная - это либо объект, либо ссылка на объект. Объекты могут содержать значения, но объекты имеют значение , а не . 42 является значением. int i = 42; создает объект с именем i типа int и присваивает этому объекту значение 42.

Документы Microsoft используют местный язык, а не строгую терминологию C ++.

Переменная constexpr определяет неизменяемый (const) объект, инициализатор которого должен быть постоянным выражением, и, следовательно, сама переменная может использоваться в местах, где требуется постоянное выражение.


Что, я думаю, означает, что constexpr подразумевает const, что подразумевает static.

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

Но другой приведенный вами ответ говорит о другом использовании static,специально функционировать - static. Таким образом, сводить это утверждение к "const подразумевает static" слишком сокращенно.

...