Как понимать определение "явно константно-оцениваемый"?

P0595 представила функцию std::is_constant_evaluated(). В документе обсуждаются некоторые ситуации, когда содержащее выражение является выражением-константой, но компилятору не требуется оценивать его во время компиляции. Приведенный пример:

constexpr double power(double b, int x) {
  if (std::is_constant_evaluated() && x >= 0) {
    // ...
    // return r;
  } else {
    // Let the code generator figure it out.
    return std::pow(b, (double)x);
  }
}

double thousand() {
  return power(10.0, 3);
}

Компилятор может оценивать power(10.0, 3) во время компиляции, но не обязан. Следовательно, is_constant_evaluated возвращает false.

Поэтому в статье вводится понятие «явно оцениваемых констант»:

Наш подход заключается в том, чтобы точно определить набор выражений, которые «явно оцениваются как константы» (новая техническая фраза), и указать, что наша новая функция возвращает true во время вычисления таких выражений и false в противном случае.

В частности, мы включаем два типа выражений в наш набор выражений, «явно вычисляемых константами». Первый тип прост: выражения в контекстах, где стандарт уже требует постоянного результата, такого как размерность массива или инициализатор переменной constexpr. ...

Это имеет смысл для меня. Однако фактическая формулировка в стандарте меня смущает:

Выражение или преобразование e явно вычисляются константами, если они:

  • константное выражение или...

Другими словами, стандарт указывает, что все константные выражения явно оцениваются константами, что (мне кажется) не включает требование, чтобы выражение появлялось в контексте, где требуется константное выражение. В предложении отмечается, что power(10.0, 3) является основным постоянным выражением, что также является моим пониманием; это делает его постоянным выражением. Если все константные выражения явно оцениваются как константы, то кажется, что здесь is_constant_evaluated должно возвращать true.

Как следует понимать определение в стандарте, чтобы оно имело точное значение, согласующееся с целью предложения?

Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
5
0
314
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Это мое любимое. Там не сказано "постоянное выражение". Там написано "постоянное выражение".

константное выражение — это грамматический термин. Это замена для тех мест в грамматике C++, где обязательно использование константных выражений.

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

Напротив, грамматика в if constexpr не принимает константное выражение, она просто принимает условие. Так что этого пункта недостаточно, чтобы покрыть if constexpr, поэтому есть специальный дополнительный пункт, чтобы покрыть «условие оператора if constexpr».


Представьте, что вам нужно ответить на этот вопрос устно. Вы слышите дефис, верно?

Не только дефис, но и курсив. Доходим ли мы до точки, когда C++ нельзя описать вслух? Простой человеческой речи уже недостаточно?

StoryTeller - Unslander Monica 23.12.2020 20:45

Не забудьте про шрифт без засечек.

T.C. 23.12.2020 21:02

Другие вопросы по теме

Странная проблема с преобразованием ссылочного типа в другой с помощью оператора reinterpret_cast
Почему конструктор по умолчанию по умолчанию удален для объединения или класса, подобного объединению?
Различное поведение consteval в GCC и MSVC (не работает)
Правильно ли A::B::B::B::B...B::f()? Почему я мог это сделать?
Как работает объявление, определение и инициализация? Я изложил, как я это понимаю, и хотел бы, чтобы меня поправили
Гарантируется ли, что адреса двух временных объектов будут разными в одном и том же выражении?
Что такое ошибка кодирования для sprintf, которая должна возвращать -1?
Доступ к собственным закрытым конструкторам через наследование конструктора производного класса
Должны ли типы шаблонов, параметризованные локальными статическими переменными из одной и той же функции шаблона, сравниваться одинаково?
Почему беззнаковое целое битового поля становится подписанным целым числом после операции сдвига в С++?