Почему у кортежей есть use_allocator, а у пар нет? - PullRequest
12 голосов
/ 01 сентября 2011

Экспериментируя с C ++ 11 std::scoped_allocator_adaptor, реализованным в gcc 4.7.0, я заметил, что C ++ 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

1 Ответ

4 голосов
/ 01 сентября 2011

Одна из причин в том, что мы хотим избежать 15 конструкторов (как в N3000 ) для, казалось бы, простого класса, такого как std :: pair.

Вместо этого у нас теперь есть один «универсальный» конструктор

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

, где вы можете передавать практически все, что вам нравится, в конструкторы каждого члена пары, включая распределители.

...