最近我在我的 constexpr 函数中修改了一些if constexpr
,if
发现它们仍然可以正常工作,并且可以在编译时进行评估。这是一个最小的情况:
template<int N>
constexpr bool is_negative()
{
if constexpr (N >= 0) return false;
else return true;
}
int main()
{
constexpr bool v = is_negative<1>();
}
在上述情况下,N
必须在编译时知道,因为它是非类型模板参数,所以if constexpr
在这里可以正常工作。但是,它是一个 constexpr 函数,因此,iirc,即使我替换为:也可以获得返回值:if constexpr
if
template<int N>
constexpr bool is_negative()
{
if (N >= 0) return false;
else return true;
}
int main()
{
constexpr bool v = is_negative<1>();
}
从cppref中,所有的要求A constexpr function must satisfy the following requirements:
都没有提到if
。if
因此,IIUC,即使所有相关变量在编译时已知(is_negative
如上),constexpr 函数是否包含在编译时评估也应该是实现定义的行为。
所以,我的结论是:
- 在 c ++ 17 之前,我们没有
if constexpr
,所以选择是if
- 在 c++17 之后,
if constexpr
如果我们希望 constexpr 函数在编译时得到评估,则首选。
以上是我的个人想法,可能有一些重要的遗漏/误解,请随时纠正我。问题仍然没有改变:if
and if constexpr
,对于期望在编译时评估的 constexpr 函数,应该首选它。