C++ if constexpr 使用 constexpr bool 相当于普通 if?

Mat*_*kes 2 c++ if-statement constexpr if-constexpr

鉴于正在检查的条件变量已标记为 ,以下代码片段在功能上是否等效constexpr

此外,这是模板化上下文中的正确用法if constexpr还是预期的应用程序。

constexpr bool kOn = false;

// Snippet 1
if (kOn) { return true; }

// Snippet 2
if constexpr (kOn) { return true; }
Run Code Online (Sandbox Code Playgroud)

Art*_*yer 8

当您使用 时if constexpr,未采用的分支(else如果条件为true或第一个语句如果条件为false)将成为废弃语句并获得 3 个“特殊能力”。

  • 如果它位于模板中并且条件与值相关(例如,if constexpr (B)您有一个 template-head template<bool B>),则在实例化专门化时根本不会实例化丢弃的分支。

  • 废弃分支内的实体仍然被 odr 使用,但不需要定义:

    int x();
    int main() {
        if constexpr (false) x();  // Does not require a definition of x
        if (false) x();  // Requires a definition of x
    }
    
    Run Code Online (Sandbox Code Playgroud)
  • 废弃分支中的 return 语句不影响auto类型推导:

    int x();
    int main() {
        if constexpr (false) x();  // Does not require a definition of x
        if (false) x();  // Requires a definition of x
    }
    
    Run Code Online (Sandbox Code Playgroud)

当然,差异if (x)并不强制x成为常量表达式,而却if constexpr (x)是。

因此,在非模板上下文中,与您的constexpr bool kOn = false;. 编译器仍然会检查两个分支,看看它们是否使用if constexpr.


Rem*_*eau 5

不,这两个ifs 不相等。

第一个是在运行时评估的,并且其两个分支中的代码在编译时都必须是格式良好的。

第二个是在编译时评估的,其未使用分支中的代码可能格式错误,因为其死代码会被编译器删除。

if constexpr不依赖于模板。