为什么Equality-Comparable类不允许使用switch-case语句?

时间:2017-06-14 11:54:17

标签: c++ switch-statement c++-concepts

为什么不允许在class - EqualityComparable语句中使用满足switch 概念的C ++ case?这个决定背后的理由是什么?

以下是EqualityComparable定义:

template <class T>
concept bool EqualityComparable() { 
    return requires(T a, T b) {
        {a == b} -> Boolean; // Boolean is the concept defining a type usable in boolean context
        {a != b} -> Boolean;
    };
}

2 个答案:

答案 0 :(得分:3)

switch语句的设计考虑了branch tables。因此它要求它以整数类型 1)运行。对我来说,这是一个历史原因,因为我可以很容易地看到一个宽松的规则,你可以有任何类型的类型,甚至提供你自己的比较器。

即使现在,编译器也不会强制使用switch的分支表(它是一个实现细节 2)),所以有一个switch语句在我看来,不能创建这些分支表(具有非整数类型)不会成为问题。

1)或枚举类型,或上下文隐式可转换为整数或枚举类型的类类型

http://en.cppreference.com/w/cpp/language/switch

2)实际上编译器可以做各种疯狂的事情,例如使用多级分支表生成经典条件跳转的hibrid。

答案 1 :(得分:1)

switch-case语句只能用于整数类型,而不能用于任意相等的类型:http://en.cppreference.com/w/cpp/language/switch

创建switch-case结构的目的是创建一个跳转表,而不仅仅是if-then-else结构的一行,这在大多数情况下更有效。在具有分支预测的现代CPU中,它可能并不总是更有效,但语言是在分支预测之前创建的(并且现在并不总是使用,例如ARM之类的嵌入式CPU)。