Durante la sperimentazione con C++ 11 std::scoped_allocator_adaptor
come implementato finora in gcc 4.7.0, ho notato che C++ 11 FDIS definisce una specializzazione di std::uses_allocator
per le tuple (20.4.2.8[tuple.traits]
), ma non per le coppie, sebbene per tutti gli altri scopi , le coppie appaiono e agiscono proprio come le tuple (hanno specializzazioni di std::get
, std::tuple_size
, ecc.).Perché le tuple hanno use_allocator ma le coppie no?
Su ulteriore lettura, N2554, che ha introdotto queste cose, definiti costruttori allocator_arg
e uses_allocator
specializzazione per le coppie pure (pagine 23-24).
Perché sono stati eliminati per le coppie? C'è un altro modo di usarli che non riesco a vedere, o si tratta di un accenno alla deprecazione delle coppie a favore delle tuple?
Il mio codice di prova era:
// 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
Vedo ora, l'implementazione di 4.7.0 di scoped_allocator_adaptor' è incompleta (a partire dalla scorsa settimana) e manca degli overload di 'construct()' per le coppie (che usano la costruzione a tratti). In effetti è sufficiente per qualsiasi caso pratico di utilizzo che potrei venire in mente. – Cubbi