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