提问人:Matt Stokes 提问时间:11/18/2023 最后编辑:Matt Stokes 更新时间:11/18/2023 访问量:123
C++ 如果 constexpr 使用相当于普通 if 的 constexpr 布尔值?
C++ if constexpr using a constexpr bool equivalent to plain if?
问:
如果正在检查的条件变量已被标记为 ?constexpr
此外,这是否是模板化上下文中的正确用法,或者是它的预期应用程序。if constexpr
constexpr bool kOn = false;
// Snippet 1
if (kOn) { return true; }
// Snippet 2
if constexpr (kOn) { return true; }
答:
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 constexpr
else
true
false
如果它位于模板中并且条件与值相关(例如,您有一个 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)
x
if constexpr (x)
因此,在非模板上下文中,与您的 .编译器仍将检查这两个分支,以查看它们是否使用 .constexpr bool kOn = false;
if constexpr
评论
1赞
StoryTeller - Unslander Monica
11/18/2023
只是表明糟糕的名称选择会让人们感到困惑。“被丢弃的语句”不一定是直观意义上的被丢弃的。那只会惹恼人们。
上一个:基于依赖表更新表
评论