C++ 如果 constexpr 使用相当于普通 if 的 constexpr 布尔值?

C++ if constexpr using a constexpr bool equivalent to plain if?

提问人:Matt Stokes 提问时间:11/18/2023 最后编辑:Matt Stokes 更新时间:11/18/2023 访问量:123

问:

如果正在检查的条件变量已被标记为 ?constexpr

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

constexpr bool kOn = false;

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

// Snippet 2
if constexpr (kOn) { return true; }
C++ IF-语句 if-constexpr

评论

1赞 StoryTeller - Unslander Monica 11/18/2023
如果 constexpr 仅在模板中具有其有用的属性(即每个人都期望的属性),并且仅在依赖于其包含的模板时才 stackoverflow.com/q/63046397/817643
1赞 StoryTeller - Unslander Monica 11/18/2023
另请参阅 stackoverflow.com/q/46512248/817643

答:

5赞 Remy Lebeau 11/18/2023 #1

不,这两个 s 并不等价。if

第一个分支在运行时进行评估,其两个分支中的代码在编译时必须格式正确。

第二个在编译时进行评估,其未使用的分支中的代码可能格式不正确,因为它的死代码被编译器删除。

if constexpr不依赖于模板。

评论

1赞 StoryTeller - Unslander Monica 11/18/2023
它在很大程度上依赖于模板才能使用。
0赞 Red.Wave 11/18/2023
@Artyer,如果丢弃的分支格式不正确,则代码片段 1 在编译时会失败。但是,即使丢弃的分支格式不正确,代码段 2 也会编译。诊断和编译行为会根据选择而变化。
0赞 StoryTeller - Unslander Monica 11/18/2023
@Red.Wave - “片段 2 编译,即使......” 不,它没有
0赞 Red.Wave 11/18/2023
@StoryTeller-UnslanderMonica,所以它最终也像这样。这太可惜了。static_assert
0赞 Swift - Friday Pie 11/18/2023
实际上,它的目的是强制 const 表达式的物化,如果不依赖于值,则丢弃语句的能力是一个副产品特征。if constexpr
8赞 Artyer 11/18/2023 #2

当你使用 时,未采取的分支(如果条件是 ,则第一个语句,如果条件是 )变成一个废弃的语句,并恰好获得 3 个“特殊能力”。if constexprelsetruefalse

  • 如果它位于模板中并且条件与值相关(例如,您有一个 template-head ),则在实例化专用化时根本不会实例化丢弃的分支。if constexpr (B)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
    }
    
  • 废弃分支中的 return 语句不影响类型推导:auto

    auto f() {
        if constexpr (false) return 0;
        return 0L;
    }  // OK: auto deduced as long
    
    auto g() {
        if (false) return 0;
        return 0L;
    }  // Error: two return statements with different types.
    

当然,这种差异不会强迫成为恒定的表达,而确实如此。if (x)xif constexpr (x)

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

评论

1赞 StoryTeller - Unslander Monica 11/18/2023
只是表明糟糕的名称选择会让人们感到困惑。“被丢弃的语句”不一定是直观意义上的被丢弃的。那只会惹恼人们。