是否可以使用if constexpr删除控制流语句

Is it possible to remove control flow statements with if constexpr?

本文关键字:删除 控制流 语句 constexpr if 可以使 是否      更新时间:2023-10-16

我正在测试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语言扩展添加了一个测试。

考虑到如果条件为false,if constexpr应该丢弃这些语句,为什么MSVC和GCC接受代码的某些部分(但不同(,而clang拒绝所有四个部分。

什么行为是正确的?

if constexpr不是宏。事实上,它只在特定环境中获得与常规if语句不同的幂,特定情况下,条件本身基于模板参数。即便如此,被丢弃的声明也必须至少具有潜在的合法性。