Во время экспериментирования с С++ 11 std::scoped_allocator_adaptor
, реализованным в gcc 4.7.0, я заметил, что С++ 11 FDIS определяет специализацию 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