Не буквальный в функции constexpr (через std :: is_constant_evaluated) - PullRequest
3 голосов
/ 13 июля 2020

В функции constexpr я не могу определить нелитеральную переменную в ветви оператора if, обусловленного выражением std::is_constant_evaluated()? В C ++ 20? Clang и G CC указывают, что это запрещено, но в приведенном ниже примере разрешены другие конструкции, которые не могут быть оценены во время компиляции. Есть ли конкретное c ограничение на использование нелитералов?

#include <type_traits>

struct Foo {
  ~Foo() {}
};

void non_constexpr() {}

constexpr bool bar()
{
  if (std::is_constant_evaluated()) {
  } else {
    non_constexpr();
    double d;
    reinterpret_cast<int*>(&d);
    Foo f;  // error: variable ‘f’ of non-literal type ‘Foo’ in ‘constexpr’ function
  }

  return true;
}

constexpr bool x = bar();

1 Ответ

3 голосов
/ 13 июля 2020

Имеется конкретное c ограничение. В данном случае структурное ограничение относительно тел constexpr функций.

[dcl.constexpr]

3 Определение функции constexpr должны удовлетворять следующим требованиям:

  • ее тело функции не должно включать
    • определение переменной нелитерального типа или stati c или потока продолжительность хранения.

Вот и все. Если вы задаетесь вопросом, почему это так, учитывая, что запрещенный код не будет выполняться с постоянной оценкой, это тоже хороший вопрос . К сожалению, я пока не знаю ответа на , что . Возможно, это просто что-то, что никто еще не подумал изменить.

...