почему нельзя использовать constexpr if (expression), даже выражение может быть оценено во время компиляции - PullRequest
0 голосов
/ 15 сентября 2018
//code1
class Test {
public:
  constexpr Test(const char *p) : p_(p) {}
  constexpr int foo() const 
  {
    if(p_[0] != 'a')
      return 1;
    else
      return 2;
  }
  const char *p_;
};

int arr[Test("bbb").foo()];  //this works

почему следующий код не работает?

  //code2
  constexpr int foo() const 
  {
    constexpr if (p_[0] != 'a') //add constexpr
      return 1;
    else
      return 2;
  }

Получил ошибку:

ошибка: ожидаемый безусловный идентификатор перед 'if'

Насколько я понимаю, так как "p_[0] != 'a'"может быть вычислено во время компиляции (как показано в code1), поэтому constexpr if (p_[0] != 'a') должно быть допустимым оператором, который можно оценить во время компиляции.

1 Ответ

0 голосов
/ 15 сентября 2018

Насколько я понимаю, поскольку "p_[0] != 'a'" может быть вычислено во время компиляции (как показано в code1), поэтому constexpr if (p_[0] != 'a') должно быть допустимым утверждением, которое может быть оценено во время компиляции.

p_[0] != 'a' можно вычислять во время компиляции, но также можно оценивать во время выполнения.

Проблема в том, что if constexpr test должен быть оценен во время компиляции. И это невозможно, когда foo() выполняется во время выполнения или когда соответствующий объект Test инициализируется во время выполнения.

Итак, ошибка.

Или лучше: ошибка, если пишешь правильно

if constexpr (p_[0] != 'a')

В вашем случае порядок между if и constexpr также неверен.

...