Eksperymentując z C++ 11 std::scoped_allocator_adaptor
, jak dotychczas zastosowałem w gcc 4.7.0, zauważyłem, że C++ 11 FDIS definiuje specjalizację std::uses_allocator
dla krotek (20.4.2.8[tuple.traits]
), ale nie dla par, chociaż do wszystkich innych celów , pary wyglądają i działają jak krotki (mają specjalizacje std::get
, std::tuple_size
, itp.).Dlaczego krotki mają use_allocator, ale pary nie?
W celu dalszego czytania, N2554, który wprowadził te rzeczy, zdefiniowano allocator_arg
konstruktorów i uses_allocator
specjalizacji również dla par (strony 23-24).
Dlaczego spadły na pary? Czy istnieje inny sposób ich użycia, którego nie widzę, czy też jest to aluzja do deprecjonowania par na korzyść krotek?
Mój kod testu było:
// 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
Teraz widzę, implementacja '.0 scoped_allocator_adaptor 'w wersji 4.7.0 jest niekompletna (jak w zeszłym tygodniu) i nie ma przeciążeń 'construct()' dla par (które używają konstrukcji kawałekej). Jest to rzeczywiście wystarczające dla każdego praktycznego zastosowania, jakie mogłem wymyślić. – Cubbi