标准中关于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 == literal
和literal == sv
这样的东西,然后你需要同构的来消除sv == sv
的歧义。
随着<=>
的采用(或者更准确地说,==
从P1185更改而来(,==
变得对称,因此不需要两个type_identity
运算符来处理literal == sv
,只要一个就足够了。我基本上是机械地通过并丢弃不必要的==
和!=
过载,所以我删除了那一秒。
但我没有意识到的是,随着另一个的消失,我们现在不再需要同质比较来消除与其他两个的歧义(我们不再有其他两个,只有另一个(——只需要一个type_identity
过载就足够了。
你可以打开一期社论来删除同质的那期。不管怎样,这只是一个例子。