![](/img/trans.png)
[英]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.