C++ switch 仅适用于整数类型的基本原理是啥? [复制]
Posted
技术标签:
【中文标题】C++ switch 仅适用于整数类型的基本原理是啥? [复制]【英文标题】:What is the rationale for C++ switch only working for integral types? [duplicate]C++ switch 仅适用于整数类型的基本原理是什么? [复制] 【发布时间】:2015-02-05 09:40:04 【问题描述】:我觉得 C++ 应该允许 switch()
超过任何可以比较的类型,而不仅仅是整数类型。这似乎很奇怪:
switch(myEnum)
case myEnumValue1:
... break;
case myEnumValue1:
... break;
在语义上与:
if(myEnum == myEnumValue1)
...
else if(myEnum == myEnumValue2)
...
但这仅适用于整数类型。为什么?这种限制的目的是什么?
我了解switch
的编译器生成的代码可能仅与整数或寄存器大小的类型兼容,但这些类型的东西通常是开发人员决定的黑盒。这些东西通常是从我们身上抽象出来的。如果跳转表更好,编译器应该生成一个。如果需要一个典型的if
/else
算法,那就这样吧。
【问题讨论】:
那个问题是关于特定代码的,答案相当于“因为 switch 只适用于整数类型”,或者我的最后一段。我正在寻找理由。 在 C 中这是不可能的,但在 C++ 中你有运算符重载,所以我认为这是一个很好的理由将switch case
功能添加到 C++ 的任何对象类型,只要它的 ==
或 @ 987654331@运算符已定义。
在n1741 中为 C++0x 提出了扩展 switch 语句,但未包括在内。最近在n3627 中再次提出了一个较弱的版本。这些文档(尤其是第一个文档)提供了很多关于为什么这不像乍看之下那么容易的见解。 (如果问题尚未结束,将发布此作为答案并提供更多详细信息)
【参考方案1】:
switch 语句继承自 C,它本身是在效率仍然受到关注的神圣时代设计的。是的,这很可能是因为它允许“计算 goto”,即跳转表。
一系列比较确实可以作为替代方案,但对于长案例列表,散列可能是首选。不在这种早期语言的范围内。
【讨论】:
我知道它是继承的,但 C++ 是一种不同的语言,更具语义性,让编译器为您做出决定。我们是否相信答案真的只是懒惰?设计师只是没注意开关? IOW,“它是继承的”并不是一个真正的答案。为什么它没有改变 C 的行为? 不,兼容性。 C++ 不是另一种语言。早期版本只是经过预处理的 C 代码。 这不会影响兼容性...我说的是 C++11/14 当然不是懒惰。以上是关于C++ switch 仅适用于整数类型的基本原理是啥? [复制]的主要内容,如果未能解决你的问题,请参考以下文章
switch语句能否作用在byte,long,string上
C++ memset 是不是仅适用于 0 和 -1? [关闭]
MFC 是不是仅适用于 Visual Studio,不适用于 Visual C++ Express?
target_compile_options() 仅适用于 C++ 文件?