代码之家  ›  专栏  ›  技术社区  ›  geza

“if constexpr”在模板之外有用吗?

  •  7
  • geza  · 技术社区  · 7 年前

    我在努力理解 if constexpr

    我明白,如果 if constexpr(expr) 在模板中使用,以及 expr then / else

    我有两个问题:

    • expr 不依赖于模板参数,则没有 if constexpr(expr) 会被丢弃吗?如果是,标准在哪里规定?我看不出标准有什么例外,只有在 expr 是依赖的。
    • if constexpr 模板之外有用吗?如果是,这有哪些用例?你能举出一些例子来理解它的用处吗?
    1 回复  |  直到 7 年前
        1
  •  5
  •   Michael Kenzel    7 年前

    如果 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 就像在正常情况下一样 如果 . 我无法用任何实际的编译器给出一个这样的例子,但是…

    推荐文章