2017-06-14 153 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

相關問題