为什么不允许在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;
};
}
答案 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)。