5

我想使用 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();
}

我正在使用带有 -std=c++17 的 g++-7.0.1

4

1 回答 1

7

if constexpr仅适用于模板。来自 [stmt.if]:

如果if语句的形式if constexpr为 ,则条件的值应为类型bool(5.20) 的上下文转换的常量表达式;这种形式称为constexpr if语句。如果转换后的条件的值为false,则第一个子语句是丢弃的语句,否则第二个子语句(如果存在)是丢弃的语句。在封闭模板化实体(第 14 条)的实例化期间,如果条件在其实例化后不依赖于值,则不实例化丢弃的子语句(如果有)。

X中,constexpr if 语句将阻止其他格式错误的语句被实例化。这就是这个语言特性的目标。但在模板之外,没有这样的等效收益。

于 2017-04-19T14:07:53.043 回答