標籤:

為什麼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& bool operator==(const T, const T);

這樣「過於寬容」的operator==的時候,由於ADL,allocator& 之間的相等比較會找到這個operator==,而這個operator==與標準庫提供的版本(也就是問題中給出的第一個重載)具有相同的優先順序(根據 [temp.func.order] 和 [temp.deduct.partial] 無法判定哪個模板 is more specialized than 另一個),所以會產生歧義。而問題中給出的第二個重載比前兩個版本都要優先(more specialized),所以用它可以消除歧義。

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++ 標準語法和標準庫如何做出優美的人機界面?

TAG:STL | C | 模板C |