2011-08-31 15 views
12

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 

Odpowiedz

4

Jednym z powodów jest to, że chcemy uniknąć 15 konstruktorów (jak w N3000) dla pozornie prostego jak klasa std :: pair.

Mamy teraz zamiast zdołali „ogólnego przeznaczenia” konstruktora

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

gdzie można przekazać tylko o cokolwiek chcesz konstruktorów każdego członka pary, w tym podzielników.

+0

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

Powiązane problemy