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