¿Cuál es la razón para que el conmutador C ++ solo funcione para tipos integrales?

Creo que C ++ debería permitir switch() sobre cualquier tipo que se pueda comparar, no solo tipos integrales. Parece extraño que:

 switch(myEnum) { case myEnumValue1: ... break; case myEnumValue1: ... break; } 

Es semánticamente lo mismo que:

 if(myEnum == myEnumValue1) ... else if(myEnum == myEnumValue2) ... 

Pero esto solo funciona en tipos integrales. ¿Por qué? ¿Cuál es el propósito de tal restricción?

Entiendo que el código generado por el comstackdor para el switch solo puede ser compatible con tipos integrales o de tamaño de registro, pero este tipo de cosas normalmente están en una caja negra a partir de las decisiones de los desarrolladores. Este tipo de cosas normalmente se abstraen de nosotros. Si una tabla de salto es mejor, el comstackdor debería generar una. Si se necesita un algoritmo típico if / else , que así sea.

La statement de cambio fue heredada de C, diseñada en los días santos cuando la eficiencia seguía siendo una preocupación. Sí, esto es muy probablemente porque permite “gotos computados”, es decir, tablas de salto.

Una secuencia de comparaciones puede ser, de hecho, una alternativa, pero para largas listas de casos, se podría preferir el hash. No en el scope de este lenguaje temprano.