為什麼libstdc++的allocator要實現兩個operator==?
template&
inline bool
operator==(const allocator&<_T1&>, const allocator&<_T2&>)
{ return true; }
template&
inline bool
operator==(const allocator&<_Tp&>, const allocator&<_Tp&>)
{ return true; }
這是libstdc++的一段代碼,我發現它重載了==兩個相同參數的情況,但是我發現沒有第二段偏特化,它也能正確給出答案。我實在是無法理解第二段優化了啥,難道就優化了參數的匹配過程,由匹配兩個變成匹配一個?
------------------------------------------------------------
我想知道這樣的寫法,在理論上是不是優化,我寫代碼沒法測出來,理論上到底算不算優化啊
如果算優化,那它優化了什麼
如果不算優化,為啥這麼寫啊
33807 - Incorrect ambiguous overload
TL;DR: 不是優化。如果不寫,在某種情況下會編譯出錯。
----
在foo所在的namespace存在
template&
這樣「過於寬容」的operator==的時候,由於ADL,allocator&
libstdc++的testsuite裡面有完整的例子:
https://github.com/gcc-mirror/gcc/blob/77c349c6b422b04118f4ec989b1c5a684636c30e/libstdc%2B%2B-v3/testsuite/20_util/allocator/33807.cc
參見 http://wg21.link/lwg2472
並沒有什麼優化一說,僅僅是告訴你隨便兩個std::allocator都相等而已,標準只要求第一個版本的,第二個寫了也沒啥問題
另外這不叫偏特化,這叫函數重載
http://en.cppreference.com/w/cpp/memory/allocator
http://en.cppreference.com/w/cpp/memory/allocator/operator_cmp
我理解是不是前者是用於不同類別的==,後者用於同一種類別的==
比如前者在傳參int和bool比較時調用,
後者在int和int比較時調用你可以打個trace試試看是不是這樣調用的
ps:這確實不是偏特化。。。推薦閱讀:
※為什麼在 C++ 中不提倡 C 風格的強制類型轉換?
※你讀過的最好的 C++ 開源代碼是什麼?
※C++17 基本完成,對於新特性大家怎麼看?
※C/C++中相同的浮點數的內存布局一定是一樣嗎?
※只使用 C++ 標準語法和標準庫如何做出優美的人機界面?