为什么 std::basic_string_view 有两个相等比较运算符?

Pow*_*mer 10 c++ c++20

std::basic_string_view关于相等比较运算符的标准引用(请参阅http://eel.is/c++draft/string.view#comparison):

\n
\n

[示例 1:operator== 的示例一致实现如下:

\n
\n
template<class charT, class traits>\nconstexpr bool operator==(basic_string_view<charT, traits> lhs,\n                        basic_string_view<charT, traits> rhs) noexcept {\n    return lhs.compare(rhs) == 0;\n}\ntemplate<class charT, class traits>\nconstexpr bool operator==(basic_string_view<charT, traits> lhs,\n                        type_identity_t<basic_string_view<charT, traits>> rhs) noexcept {\n    return lhs.compare(rhs) == 0;\n}\n
Run Code Online (Sandbox Code Playgroud)\n
\n

\xe2\x80\x94结束示例]

\n
\n

第二个比较运算符是否足以满足所有用例?如果答案是否定的,请提供示例代码,如果删除第一个比较运算符,该代码将停止工作(或以不同方式工作)。如果答案是肯定的,那么为什么 C++ 标准明确要求定义第一个运算符?

\n

Bar*_*rry 10

我认为,由于P1614<=>中采用了 ,因此减少的力度还不够。在那篇论文之前,示例中有 3 个s:==

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;
   }
Run Code Online (Sandbox Code Playgroud)

当时,我们需要三名操作员。这些处理诸如和 之type_identity类的东西 ,然后您需要同质的来消除歧义。sv == literalliteral == svsv == sv

随着<=>采用(或者更准确地说,==P1185开始的更改),==变得对称,因此您不需要两个type_identity运算符来处理literal == sv,只需一个就足够了。我基本上是机械地浏览并丢弃不必要的==!=超载的内容,所以我删除了那一秒。

但我没有意识到的是,随着另一个的消失,我们现在不再需要同质比较来消除与其他两个的歧义(我们不再有其他两个,只有另一个) - 只需要一个重载就足够type_identity了。

您可以开一期社论来删除同类期刊。或者不是,无论如何这只是一个例子。

  • 不必要的第一个比较运算符不仅出现在示例中,而且还出现在标准的强制 [string.view.synop] 部分中。如果确实没有必要,则必须将其删除 - 使库代码更短,并减少像我这样的用户提出的问题。您能否亲自处理打开一个编辑问题,因为即使我打开它,您也可能最终成为修复标准文本的人? (3认同)