为什么不能使用 constexpr if (expression) ,甚至可以在编译时评估表达式

why can't use constexpr if (expression) , even the expression can be evaluated at compile time

//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;
  }

出现错误:

error: expected unqualified-id before ‘if’

据我了解,由于“p_[0] != 'a'”可以在编译时求值(如代码1所示),所以constexpr if (p_[0] != 'a')应该是一个有效的语句,可以在编译期间求值。

To my understanding, since "p_[0] != 'a'" can be evaluated at compile time(as shown in code1), so constexpr if (p_[0] != 'a') should be a valid statement which can be evaluate during compiling.

p_[0] != 'a' 可以在编译时求值,但也可以在运行时求值。

问题是 if constexpr 测试 必须 在编译时评估。而这在foo()执行运行时或者对应Test对象初始化运行时是不可能的。

所以报错。

或者更好:如果你写对了错误

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

在你的情况下,ifconstexpr 之间的顺序也是错误的。