GCC9 已经实现了std::is_constant_evaluated
. 我用它玩了一点,我意识到它有点棘手。这是我的测试:
constexpr int Fn1()
{
if constexpr (std::is_constant_evaluated())
return 0;
else
return 1;
}
constexpr int Fn2()
{
if (std::is_constant_evaluated())
return 0;
else
return 1;
}
int main()
{
constexpr int test1 = Fn1(); // Evaluates to 0
int test2 = Fn1(); // Evaluates to 0
int const test3 = Fn1(); // Evaluates to 0
constexpr int test4 = Fn2(); // Evaluates to 0
int test5 = Fn2(); // Evaluates to 1
int const test6 = Fn2(); // Evaluates to 0
}
根据这些结果,我得出以下结论:
if constexpr (std::is_constant_evaluated())
总是评估true
分支。因此,使用这种结构是没有意义的。如果编译器在编译时评估一个变量,
std::is_constant_evaluated())
则 istrue
,无论该变量是否被显式注释constexpr
。
我对吗?