[英]Does C++17 std::basic_string_view invalidates the use of C strings?
[英]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 == literal
和literal == sv
之类的东西,然后您需要同质的东西来消除sv == sv
的歧义。
随着<=>
的采用(或更准确地说, ==
从P1185更改), ==
变得对称,因此您不需要两个type_identity
运算符来处理literal == sv
,一个就足够了。 我基本上是机械地经历并丢弃不必要的==
和!=
重载,所以我删除了第二个。
但是我没有意识到的是,随着另一个消失了,我们现在不再需要同质比较来消除其他两个的歧义(我们不再有其他两个,只有另一个)——只有一个type_identity
就足够了超载。
您可以打开编辑问题以删除同质问题。 与否,无论如何,这只是一个例子。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.