2011-08-31 6 views
12

अब तक जीसीसी 4.7.0 में लागू सी ++ 11 std::scoped_allocator_adaptor के साथ प्रयोग करते हैं, मैंने देखा है कि सी ++ 11 एफ डी आई tuples के लिए std::uses_allocator की एक विशेषज्ञता (20.4.2.8[tuple.traits]) को परिभाषित करता है, लेकिन जोड़े के लिए नहीं, अन्य सभी प्रयोजनों के लिए, हालांकि , जोड़े टुपल्स की तरह दिखते हैं और कार्य करते हैं (उनके पास std::get, std::tuple_size आदि की विशेषज्ञता है)।टुपल्स का उपयोग_लोकेटर क्यों करता है लेकिन जोड़े नहीं करते हैं?

आगे पढ़ने पर, N2554, जो इन चीजों को पेश करता है, परिभाषित allocator_arg कन्स्ट्रक्टर और uses_allocator जोड़ों के लिए विशेषज्ञता (पेज 23-24)।

वे जोड़े के लिए क्यों गिराए गए थे? क्या उनका उपयोग करने का कोई और तरीका है जिसे मैं नहीं देख सकता, या क्या यह टुपल्स के पक्ष में जोड़े के बहिष्कार का संकेत है?

मेरे परीक्षण कोड था:

// myalloc is like std::allocator, but has a single-argument 
// constructor that takes an int, and has NO default constructor 
typedef std::vector<int, myalloc<int>> innervector_t; 
typedef std::tuple<int, innervector_t> elem_t; 
typedef std::scoped_allocator_adaptor<myalloc<elem_t>, myalloc<int>> Alloc; 
Alloc a(1,2); 
std::vector<elem_t, Alloc> v(a); 
v.resize(1);     // uses allocator #1 for elements of v 
// the following line fails to compile if pair is used instead of tuple 
// because it attempts to default-construct myalloc<int> for innervector_t 
std::get<1>(v[0]).resize(10); // uses allocator #2 for elements of innervector_t 

उत्तर

4

एक कारण यह है कि हम std :: जोड़ी की तरह एक उचित रूप में सरल वर्ग के लिए 15 कंस्ट्रक्टर्स (N3000 में की तरह) से बचने के लिए चाहते हैं।

अब हम बजाय एक "सामान्य प्रयोजन" निर्माता

template <class... Args1, class... Args2> 
pair(piecewise_construct_t, 
    tuple<Args1...> first_args, tuple<Args2...> second_args); 

जहां केवल आपके प्रत्येक जोड़ी के सदस्य की कंस्ट्रक्टर्स, allocators सहित चाहते कुछ के बारे में पारित कर सकते हैं मिल गया है।

+0

मैं अब देखते हैं, 'scoped_allocator_adaptor' के 4.7.0 के कार्यान्वयन अधूरा है (पिछले सप्ताह के रूप में), और' निर्माण के भार के अभाव है() 'जोड़े (जो piecewise निर्माण का उपयोग करें) के लिए। यह वास्तव में किसी भी व्यावहारिक उपयोग के मामलों के लिए पर्याप्त है जिसके साथ मैं आ सकता हूं। – Cubbi