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)
当您使用 时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.
不,这两个ifs 不相等。
第一个是在运行时评估的,并且其两个分支中的代码在编译时都必须是格式良好的。
第二个是在编译时评估的,其未使用分支中的代码可能格式错误,因为其死代码会被编译器删除。
if constexpr不依赖于模板。
| 归档时间: |
|
| 查看次数: |
139 次 |
| 最近记录: |