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++ 文件?

target_compile_options() 仅适用于 C++ 文件?

MySQL FIND_IN_SET OR IN 仅适用于第一个整数?