为什么不能使用 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')
在你的情况下,if
和 constexpr
之间的顺序也是错误的。
//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), soconstexpr 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')
在你的情况下,if
和 constexpr
之间的顺序也是错误的。