簡體   English   中英

為什么 std::basic_string_view 有兩個相等比較運算符?

[英]Why does std::basic_string_view have two equality comparison operators?

標准中關於std::basic_string_view相等比較運算符的引用(參見http://eel.is/c++draft/string.view#comparison ):

[示例 1:符合 operator== 的示例實現將是:

template<class charT, class traits>
constexpr bool operator==(basic_string_view<charT, traits> lhs,
                        basic_string_view<charT, traits> rhs) noexcept {
    return lhs.compare(rhs) == 0;
}
template<class charT, class traits>
constexpr bool operator==(basic_string_view<charT, traits> lhs,
                        type_identity_t<basic_string_view<charT, traits>> rhs) noexcept {
    return lhs.compare(rhs) == 0;
}

——結束示例]

第二個比較運算符是否足以滿足所有用例? 如果答案是否定的,請提供如果刪除第一個比較運算符將停止工作(或將以不同方式工作)的示例代碼。 如果答案是肯定的,那么為什么 C++ 標准明確要求定義第一個運算符?

我認為這是由於在P1614中采用<=>導致的減少不足。 在那篇論文之前,示例中有三個==

template<class charT, class traits>
    constexpr bool operator==(basic_string_view<charT, traits> lhs,
                              basic_string_view<charT, traits> rhs) noexcept {
      return lhs.compare(rhs) == 0;
    }
  template<class charT, class traits>
    constexpr bool operator==(basic_string_view<charT, traits> lhs,
                              type_identity_t<basic_string_view<charT, traits>> rhs) noexcept {
      return lhs.compare(rhs) == 0;
    }
 template<class charT, class traits>
   constexpr bool operator==(type_identity_t<basic_string_view<charT, traits>> lhs,
                             basic_string_view<charT, traits> rhs) noexcept {
     return lhs.compare(rhs) == 0;
   }

當時,我們需要三個操作員。 type_identity處理諸如sv == literalliteral == sv之類的東西,然后您需要同質的東西來消除sv == sv的歧義。

隨着<=>的采用(或更准確地說, ==P1185更改), ==變得對稱,因此您不需要兩個type_identity運算符來處理literal == sv ,一個就足夠了。 我基本上是機械地經歷並丟棄不必要的==!=重載,所以我刪除了第二個。

但是我沒有意識到的是,隨着另一個消失了,我們現在不再需要同質比較來消除其他兩個的歧義(我們不再有其他兩個,只有另一個)——只有一個type_identity就足夠了超載。

您可以打開編輯問題以刪除同質問題。 與否,無論如何,這只是一個例子。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM