繁体   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