關于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 標準明確要求定義第一個運算子?
uj5u.com熱心網友回復:
我認為這是由于采用 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;
}
當時,我們需要三個操作員。那些處理像and之type_identity類的東西 ,然后你需要同質的來消除歧義。sv == literalliteral == svsv == sv
隨著<=>采用(或更準確地說,==從P1185的更改),==變得對稱,因此您不需要兩個type_identity運算子來處理literal == sv,一個就足夠了。我基本上是機械地經歷并放棄不必要==的和!=超載,所以我洗掉了那一秒。
但是我沒有意識到的是,隨著另一個消失了,我們現在不再需要同質比較來消除另外兩個的歧義(我們不再有其他兩個,只有另一個)-只需一個type_identity多載就足夠了.
您可以打開編輯問題以洗掉同質問題。與否,無論如何,這只是一個例子。
轉載請註明出處,本文鏈接:https://www.uj5u.com/gongcheng/421210.html
標籤:
