簡體   English   中英

當模板參數要求 std::less 時,編譯器如何在 std::set 中使用 T::operator&lt;<T> ?

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM