std::basic_string_view关于相等比较运算符的标准引用(请参阅http://eel.is/c++draft/string.view#comparison):
\n\n[示例 1:operator== 的示例一致实现如下:
\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}\nRun Code Online (Sandbox Code Playgroud)\n\n\n\xe2\x80\x94结束示例]
\n
第二个比较运算符是否足以满足所有用例?如果答案是否定的,请提供示例代码,如果删除第一个比较运算符,该代码将停止工作(或以不同方式工作)。如果答案是肯定的,那么为什么 C++ 标准明确要求定义第一个运算符?
\nBar*_*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了。
您可以开一期社论来删除同类期刊。或者不是,无论如何这只是一个例子。
| 归档时间: |
|
| 查看次数: |
317 次 |
| 最近记录: |