![](/img/trans.png)
[英]how to use std::find with an < operator that is not std::less
[英]How does a compiler use T::operator< in std::set when the template parameter asks for std::less<T>?
創建std::set
,模板參數之一是class Compare
,默認為std::less<T>
。
現在,即使您沒有對std::less<T>
進行專門化,定義T::operator<
也足以讓 C++“弄清楚”。 但是 C++ 並沒有解決任何問題,編譯器可以。
編譯器正在經歷一系列我確信都是簡單的步驟。 那些步驟是什么?
標准庫被定義為std::less<T>
將使用operator<
除非另有專門。 因此,如果您不提供專業化,如果類型支持<
則它會起作用。
從std::less<T>
:
用於執行比較的函數對象。 除非專門,否則在類型
T
上調用operator<
。
對於std::less<T>::operator()
:
可能的實現:
constexpr bool operator()(const T &lhs, const T &rhs) const
{
return lhs < rhs;
}
查看編譯器定義的std::less<void> 特化。
如您所見,它只是返回 lhs < rhs 的結果。
至於編譯器如何知道綁定std::less<void>
而不是std::less<T>
,那是因為沒有明確編寫std::less<T>
。 所以當你要求它時,它必須自動生成。
那么為什么編譯器會找到std::less<void>
而不是std::less<>
? 那是因為當您不將模板參數傳遞給std::less
您會得到std::less<void>
。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.