是否可以使用 if constexpr 删除控制流语句?
Is it possible to remove control flow statements with if constexpr?
我正在测试 if constexpr
的可能性,我想知道是否可以用它删除控制流语句。
我正在测试的代码是:
int main() {
void *indirect_label;
if constexpr (false) {
goto label; // Rejected by MSVC, clang and GCC
}
if constexpr (false) {
continue; // Rejected by clang and GCC
}
if constexpr (false) {
break; // Rejected by clang and GCC
}
if constexpr (false) {
goto *indirect_label; // Rejected by clang and MSVC
}
return 1;
}
我为 GCC 和 clang 实现的间接 gotos 语言扩展添加了一个测试。
考虑到如果条件为假,if constexpr
应该丢弃语句,为什么 MSVC 和 GCC 接受代码的某些部分(但不同)而 clang 拒绝所有四个。
什么行为是正确的?
if constexpr
不是宏。实际上,它仅在 特定情况下 获得与常规 if
语句不同的权力,这些情况都在模板中并且条件本身基于模板参数。即使那样,被丢弃的陈述也必须至少是潜在合法的。
我正在测试 if constexpr
的可能性,我想知道是否可以用它删除控制流语句。
我正在测试的代码是:
int main() {
void *indirect_label;
if constexpr (false) {
goto label; // Rejected by MSVC, clang and GCC
}
if constexpr (false) {
continue; // Rejected by clang and GCC
}
if constexpr (false) {
break; // Rejected by clang and GCC
}
if constexpr (false) {
goto *indirect_label; // Rejected by clang and MSVC
}
return 1;
}
我为 GCC 和 clang 实现的间接 gotos 语言扩展添加了一个测试。
考虑到如果条件为假,if constexpr
应该丢弃语句,为什么 MSVC 和 GCC 接受代码的某些部分(但不同)而 clang 拒绝所有四个。
什么行为是正确的?
if constexpr
不是宏。实际上,它仅在 特定情况下 获得与常规 if
语句不同的权力,这些情况都在模板中并且条件本身基于模板参数。即使那样,被丢弃的陈述也必须至少是潜在合法的。