2016-09-09 46 views
29

C++ 17規範棄用std::allocator對象的constructdestroy成員。工作組提供了在標題爲「棄用std :: allocator的冗餘成員」標題下棄用其他成員函數here的基本原理。爲什麼std :: allocator的構造和銷燬函數在C++ 17中不推薦使用?

但是,他們沒有具體提及爲什麼這兩個成員不推薦使用,或者推薦使用什麼替代功能。我假設含義是用std::allocator_traits::construct代替。

我有點困惑是否實施construct實際上可能仍然有必要在某些情況下,雖然因爲this comment about std::allocator_traits::construct

由於這個功能提供自動回落到安置新的成員函數構造()是自C++ 11以來的可選分配器要求。

對於(使用memalign例如,對於頁對齊的內存)自定義的分配,將回落至安置new總是產生正確的行爲?

回答

15

allocator requirements tableconstruct(c, args),如果提供,必須「構造C類型的對象在c」。

它完全沒有說什麼1)什麼參數將被傳遞給C的構造函數或2)這些參數是如何傳遞的。這是分配者的選擇,實際上標準中的兩個分配器在將它們傳遞給C的構造函數:std::scoped_allocator_adaptorstd::pmr::polymorphic_allocator之前確實弄亂了這些參數。特別是在構建std::pair時,它們傳遞給pair的構造函數的參數可能甚至不像它們收到的參數。

沒有要求完美轉發,要麼;如果效率低下,C++ 03風格的construct(T*, const T&)就符合了。

std::allocatorconstructdestroy都反對,因爲他們是無用的:沒有良好的C++ 11和以後的代碼都不應直接調用他們,他們什麼都不添加了默認。


處理內存對齊應該是allocate任務,不construct

7

該功能與論文D0174R0 Deprecating Vestigial Library Parts in C++17中的其他功能一起被刪除。如果我們看一下相關的部分,我們有

性病的許多成員::分配器冗餘複製該否則由std::allocator_traits<allocator<T>>生產的行爲,並能安全地去除,以簡化這個類。此外,作爲自由函數的addressof取代std::allocator<T>::address,它需要一個正確類型的分配器對象。最後,引用類型別名最初是作爲與其他分配器一起擴展的預期方式提供的,但是當我們指定分配器需求時(17.6.3.5 [allocator.requirements]),結果卻不起作用。

儘管我們無法在不破壞與明確使用此分配器類型的代碼的向後兼容性的情況下移除這些成員,但我們不應該建議繼續使用它們。如果一個類型想要支持泛型分配器,它應該通過allocator_traits訪問分配器的功能,而不是直接訪問分配器的成員 - 否則它將不能正確支持依賴於特性來合成默認行爲的分配器。同樣,如果用戶不打算支持泛型分配器,那麼直接調用新的,刪除並直接假設std :: allocator的其他屬性(如指針類型)就簡單多了。

重點煤礦

所以,理性是我們並不需要複製所有分配的代碼,因爲我們有分配器特質。如果我們看一下std::allocator_traits我們將看到它確實有

allocate 
deallocate 
construct 
destroy 
max_size 

靜態函數,所以我們可以用這些代替分配器的人。

+0

是的,我幾乎在這個問題上說了很多。 –

相關問題