我想使用constexpr bool(下例中的useF
)来启用以下代码中的功能。在这里,呼叫A::f()
。另外,在我关闭该功能的情况下,我希望将别名模板(a
)设为void
。
我尝试使用constexpr if语句,但是主体仍在实例化,这会导致编译错误。如果我使用包装器模板(X
),正如我预期的那样丢弃了正文,但这对我来说似乎很难看。还有其他方法吗?
constexpr bool useF = false;
struct A {
static void f() {}
};
using a = std::conditional<useF, A, void>::type;
template<typename L>
struct X {
static void h() {
if constexpr(std::is_same<L, A>::value) {
L::f(); // not instantiated, no error
}
}
};
int main() {
if constexpr(useF) {
a::f(); // error!?
}
X<a>::h();
}
我正在使用g ++ - 7.0.1和-std = c ++ 17
答案 0 :(得分:7)
if constexpr
仅适用于模板。来自[stmt.if]:
如果
if
语句的格式为if constexpr
,则条件的值应为类型bool
的上下文转换常量表达式(5.20);此表单称为 constexpr if 语句。如果值 转换后的条件为false
,第一个子语句是废弃语句,否则第二个子语句(如果存在)是废弃语句。 在封闭的模板化实体的瞬间 (第14条),如果条件在实例化后不依赖于值,则丢弃的子语句(如果有的话)不会被实例化。
在X
内,constexpr if语句将阻止实例化其他格式错误的语句。这是此语言功能的目标。但是在模板之外,没有这样的等效收益。