是否可以使用 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 语句不同的权力,这些情况都在模板中并且条件本身基于模板参数。即使那样,被丢弃的陈述也必须至少是潜在合法的。