Чего вам не хватает, так это того, где используется строгая терминология 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
" слишком сокращенно.