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



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

[示例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过载就足够了。

你可以打开一期社论来删除同质的那期。不管怎样,这只是一个例子。

相关内容

  • 没有找到相关文章

最新更新