如果有一个if-constexpr,怎么没有switch-constexpr?

ein*_*ica 4 c++ c++17 c++20 if-constexpr

在C++ 17中,if constexpr介绍了; 然而,似乎没有switch constexpr(见这里).这是为什么?也就是说,如果一个编译器支持if constexpr,它支持它是否也是微不足道的switch constexpr(最坏的情况是if-then-else-if-etc.链,或多个如果带有一些标志来控制直通)?

Nic*_*las 13

if constexpr最终来自一个更理智的static if概念形式.由于这种推导,switch标准委员会似乎没有考虑应用相同的想法.所以这可能是主要原因:没有人将它添加到论文中,因为它是一种限制形式的语法,switch这是没有意义的.

话虽如此,其中switch有很多包袱.最值得注意的是自动穿透行为.这使得定义其行为有点问题.

请参阅,其中一个功能if constexpr是在某些条件下丢弃在编译时未采用的一方.这是语法的重要部分.因此,switch constexpr预期假设具有相似的权力.

对于fallthrough来说,这很难做到,因为case块不像if声明的两个块那样根本不同.特别是如果你有条件的通过.现在,您可以switch constexpr不进行自动穿透(或完全穿透),以便不同的部分是不同的.但是,你巧妙地改变了语法的工作方式; 非constexpr形式的switch行为与constexpr形式不同.这不好.

是的,您可以将编译错误设置为不在break;标签之间放置语句.

请注意,两个主要的模式匹配提议P1308和P1260,特别是避免使用switch,而是发明一个新的关键字.他们都有constexpr方面,但他们非常清楚,他们不是switch/case.

  • 虽然两个提案都很有趣,但P1308引入的语法看起来与当前的C++非常相似.P2160是一篇非常引人入胜的论文. (4认同)
  • @JonHarper:"*P1308引入的语法看起来很像当前的C++.*"你知道,通常我会回答"你说这好像是坏事;".但在看了那个提议后,那里有点可怕. (3认同)