【发布时间】:2020-02-21 18:13:46
【问题描述】:
我正在测试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 实现的间接 goto 语言扩展添加了一个测试。
考虑到如果条件为假,if constexpr 应该丢弃语句,为什么 MSVC 和 GCC 接受代码的某些部分(但不同)而 clang 拒绝所有四个。
什么行为是正确的?
【问题讨论】:
-
坐下来等待有人完全错过问题的重点并开始为
gotos 发疯。 -
请注意
if constexpr用于模板。如果代码不依赖,则仍会编译正文:stackoverflow.com/questions/59393908/… -
这些控制语句在使用它们的上下文中没有任何意义。您不能在这些点使用
continue;或break;,并且label不存在。间接 goto 不是标准 C++。 -
如果您能向我们展示您想要达到的目标,我们或许可以帮助您。
-
@NicolasBértolo:这甚至比不上
if constexpr的幂。函数相互隔离,if constexpr没有任何改变。