2017-03-11 9 views
9

क्या यह तकनीकी रूप से std::allocator विशेषज्ञता (निश्चित रूप से, void के लिए विशेषज्ञता के अलावा) एसटीएल कंटेनर के लिए टेम्पलेट पैरामीटर के रूप में उपयोग करने के लिए मान्य है (उन सभी में से नहीं, लेकिन नीचे उल्लिखित प्लस unordered_ (बहु) मानचित्र/सेट)? निम्नलिखित कोड ठीक संकलित करता है।कुछ एसटीएल कंटेनर के लिए विस्मृत std :: आवंटक

#include <list> 
#include <forward_list> 
#include <deque> 
#include <set> 
#include <map> 

int main() 
{ 
    struct A { bool operator < (A) const { return true; } }; 
    struct B {}; 
    struct C {}; 
    std::list< A, std::allocator<C> > l; 
    std::forward_list< A, std::allocator<C> > fl; 
    std::deque< A, std::allocator<C> > d; 
    std::set< A, std::less<A>, std::allocator<C> > s; 
    std::multiset< A, std::less<A>, std::allocator<C> > ms; 
    std::map< A, B, std::less<A>, std::allocator<C> > m; 
    std::multimap< A, B, std::less<A>, std::allocator<C> > mm; 
} 

मेरा मानना ​​है कि इस संभाजक तुरंत किया जा रहा है इसके स्रोत प्रकार से कोई संबंध के बिना अंतर्निहित नोड प्रकार के लिए पलटाव के कारण है।

+0

मैं कहना चाहता हूँ यह अनिर्धारित व्यवहार हो सकता है, लेकिन मैं नहीं जानता कि (शायद आवंटक वैसे भी विभिन्न प्रकार के लिए समान है) –

उत्तर

10

मैं कहता हूँ कि हम इस यूबीसंभाजक अवगत कंटेनर आवश्यकताओं क्योंकि एक संभाजक जो एक अलग value_type कंटेनर के value_type से है निर्दिष्ट करने का उल्लंघन करती है (कम से कम सी ++ 11 में) जो ऐसे मामलों का मतलब सामान्य कंटेनर आवश्यकताओं के अनुरूप नहीं है। इसके अलावा, मुझे सी ++ 11 मानक में कुछ भी नहीं मिला है जो कहता है कि आवंटक प्रकार टेम्पलेट पैरामीटर के रूप में प्रदान किए गए प्रकार से रिबाउंड होना चाहिए।


  1. धारा [container.requirements.general] हमें बताता है:

13) कंटेनर सरणी को छोड़कर इस खंड में और 21.4 में() में परिभाषित के सभी एक संभाजक अवगत कंटेनर के अतिरिक्त आवश्यकताओं को पूरा, के रूप में तालिका में वर्णित 99.

  2. संभाजक अवगत कंटेनर आवश्यकताओं का कहना है:

+०१२३५१६४१०

आवश्यक है: allocator_type::value_typeX::value_type जैसा ही है।

  1. धारा [default.allocator]

typedef T value_type;

नाम स्थान std में allocator टेम्पलेट के सदस्य के रूप निर्दिष्ट करता है।

  4. धारा [multimap.overview] शामिल हैं:

template <class Key, class T, class Compare = less<Key>, 
    class Allocator = allocator<pair<const Key, T> > > 
class multimap { 
    [...] 
    typedef Allocator allocator_type; 
    [...] 
}; 

(अन्य कंटेनरों के लिए इसी तरह के निष्कर्षों के साथ।)

+0

अंक 1 + 2 पर्याप्त हैं। – Orient

+1

@ ओरिएंट: नहीं क्योंकि प्वाइंट 4 में टाइपपीफ कुछ टाइप कर सकता है जैसे 'typedef typename std :: allocator_traits :: टेम्पलेट rebind_alloc allocator_type;' जो तस्वीर को थोड़ा अलग बना देगा। – Pixelchemist

+3

अतिरिक्त जानकारी: libC++ इस यूबी को 'static_assert' के साथ संकलन-समय पर पकड़ता है। –

संबंधित मुद्दे