如果
expr
if constexpr(expr)
是的,确实如此。你在找什么
[stmt.if]/2
[…]在封闭模板实体的实例化过程中,如果条件在实例化后不依赖于值,则丢弃的子状态(如果有)不会实例化。[…]
cppreference.com
template<class T> void g() {
auto lm = [](auto p) {
if constexpr (sizeof(T) == 1 && sizeof p == 1) {
// this condition remains value-dependent after instantiation of g<T>
}
};
}
是
if constexpr
模板之外有用吗?如果是,你能举一些例子来理解它的有用性吗?
而当
不会出现在模板内部,
[basic.def.odr]/10
仍然适用于:
每个程序应包含该程序中使用的每个非内联函数或变量的一个定义
在被丢弃的语句之外
我的。这实际上意味着在丢弃的语句中对实体的odr使用不算数。例如:
void blub();
constexpr bool use_blub = false;
void f()
{
if constexpr (use_blub)
{
blub();
}
}
呼吁
blub()
blub()
如果条件为假。使用普通
if
blub()
在某个地方,即使它从未被使用过。因此,您可以,例如,使用
根据库是否可用(以及是否链接到),在调用某个库函数和调用某个回退实现之间切换。除此之外,假设编译器可能不会警告由于错误而无法访问的代码
if constexpr
就像在正常情况下一样
如果
. 我无法用任何实际的编译器给出一个这样的例子,但是…