2011-08-31 5 views
12

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 

risposta

4

Una ragione è che vogliamo evitare di avere 15 costruttori (come in N3000) per una classe di apparentemente semplice come std :: coppia.

ora abbiamo invece ottenuto uno "general-purpose" costruttore

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

dove si può passare qualsiasi cosa che ti piace ai costruttori di ogni membro coppia, tra cui allocatori.

+0

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