【发布时间】:2019-06-12 13:46:51
【问题描述】:
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())是true,不管那个 变量是否显式注释constexpr。
我说的对吗?
【问题讨论】:
-
您为此使用了哪些头文件和编译器选项?
-
@P.W 标头
<type_traits>和编译器选项-std=c++2a
标签: c++ constexpr c++20 if-constexpr