2017-06-14 62 views
0

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

这里遵循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

是类构造函数'constexpr'? – StoryTeller

+0

考虑添加'language-lawyer'标签 – alexeykuzmin0

+1

@Quentin - [Not quite](http://eel.is/c++draft/stmt.switch#:label,case)。 – StoryTeller

回答

3

switch声明设计时考虑branch tables。所以它要求它使用整数类型1)。对我而言,这是一个历史性的原因,因为我可以很容易地看到一个宽松的规则,你可以有任何类型的比较,甚至提供自己的比较。

即使现在,编译器不被迫使用分支表格提供switch(它是一个实现细节2)),所以具有switch声明不能创建这些分支表(具有非整数类型)在我的愚见中不会成为问题。


1)或枚举类型,或一个类类型上下文隐式转换为一个整体或枚举类型的

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

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

+0

我的课程实际上只是一个int包装,记住了类型安全和范围边界(0..9)。虽然可以将它与其基础类型进行比较,但将其隐式转换为其基础类型只是为了使其可用于switch-case语句是不行的... – nyarlathotep108

+1

是的,我不会建议仅为'之开关。在你的情况下,我可以很容易地用'switch(static_cast (my_ob))'或'switch(my_obj.to_int())'或'switch(my_obj.to_underlying())',甚至switch((int) my_obj)' – bolov

1

开关-case语句只能用于整数类型,不是任意的平等可比类型:http://en.cppreference.com/w/cpp/language/switch

创建的switch-case结构的意图是,它创造的,而不是仅仅是一个线跳转表的if-then-else结构,在大多数情况下效率更高。在具有分支预测的现代CPU中,它可能并不总是更高效,但是在分支预测成为事物之前创建了语言(并且即使现在也不总是使用该语言,例如像ARM这样的嵌入式CPU)。

+0

我明白这一点,但为什么它没有在C++中扩展? – nyarlathotep108

+0

@ nyarlathotep108在我看来(我还没有看到任何官方的解释),这是因为即使在最受限制的平台上,C++也必须快速。所以它必须通过开关来保持跳转表的行为。(请记住,这只是我的意见而不是官方的解释) – nefas

+0

@nefas我仍然认为编译器应该能够翻译代码的快速跳转表varsion,当类型是可积分的可评估的,而另一个版本的较慢版本情况...:/ – nyarlathotep108

相关问题