2011-08-31 14 views
12

Al experimentar con C++ 11 std::scoped_allocator_adaptor implementado en gcc 4.7.0 hasta ahora, noté que C++ 11 FDIS define una especialización de std::uses_allocator para tuplas (20.4.2.8[tuple.traits]), pero no para pares, aunque para todos los demás fines , los pares se ven y actúan como tuplas (tienen especializaciones de std::get, std::tuple_size, etc.).¿Por qué las tuplas tienen uses_allocator pero los pares no?

En la lectura adicional, N2554, que introdujo estas cosas, definió allocator_arg constructores y uses_allocator especialización para los pares también (páginas 23-24).

¿Por qué se cayeron por pares? ¿Hay alguna otra forma de usarlos que no puedo ver, o es una señal de desaprobación de pares a favor de las tuplas?

Mi código de prueba fue:

// 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 

Respuesta

4

Una de las razones es que queremos evitar tener 15 constructores (como en N3000) para una clase aparentemente simple como std :: pair.

que tenemos ahora en vez conseguido un "propósito general" constructor

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

donde se puede pasar casi cualquier cosa que gusta a los constructores de cada miembro de la pareja, incluyendo los colocadores.

+0

Veo ahora, la implementación 4.7.0 de 'scoped_allocator_adaptor' está incompleta (a partir de la semana pasada), y carece de las sobrecargas de' construct() 'para pares (que usan construcción por partes). De hecho, es suficiente para cualquier caso de uso práctico que se me ocurra. – Cubbi

Cuestiones relacionadas