Почему функции constexpr не могут использовать функции consteval, в то время как вы можете создавать объекты constexpr из функций consteval?

У вас могут быть объекты constexpr перед consteval, но вы не можете использовать consteval внутри constexpr.

Почему?

Я думал, что consteval должен быть своего рода узким constexpr.

Пожалуйста, помогите мне разобраться в этом дизайне.

constexpr int constexpr_sqr(int n) { return n*n; }
consteval int consteval_sqr(int n) { return n*n; }
constexpr int constexpr_sqr2(int n) { 
  // not allowed
  // return consteval_sqr(n);
   
  // not allowed
  // constexpr imm = consteval_sqr(n);
  // return imm;

  return constexpr_sqr(n);
}
int main() {
  // while can do this
  constexpr auto imm = consteval_sqr(999);
}

[Прямой]


person sandthorn    schedule 13.08.2020    source источник
comment
Поскольку аргумент функции никогда не является постоянным выражением   -  person Oliv    schedule 13.08.2020


Ответы (1)


Это аргумент. constexpr функция не требует постоянного вычисления. Это означает, что n нельзя использовать в постоянном выражении.

Я думал, что consteval должен быть своего рода узким constexpr.

Нет, это просто функции, которые должны оцениваться постоянно. Это означает, что их аргументы должны всегда использоваться в константных выражениях.

Вы можете вызвать функцию constexpr с аргументами, которые нельзя использовать в константном выражении, и пока вы не находитесь в контексте, требующем константного выражения, она по-прежнему хорошо сформирована.

person StoryTeller - Unslander Monica    schedule 13.08.2020
comment
Ах ... consteval просто сворачивает суперпозицию функции constexpr. - person sandthorn; 13.08.2020