23

While looking at std::allocator, I see that members:
value_type, pointer, const_pointer, reference, const_reference, size_type, difference_type, and rebind have all been deprecated.

Allocators will also no longer have the members:
address, max_size, construct, or destroy.

Why did this happen? Did it have something to do with polymophic allocators?

Trevor Hickey
  • 36,288
  • 32
  • 162
  • 271
  • 3
    The first set of members look like they really make sense for containers, not allocators. I believe that there's a `std::addressof` now to replace address(). Who needs max_size anyway; and the rest should be replaceable by placement new/explicit destructor invocation. – Sam Varshavchik Jul 25 '16 at 10:34
  • 2
    There is now also an [`allocator_traits`](http://en.cppreference.com/w/cpp/memory/allocator_traits) that will fill in the missing parts. – Bo Persson Jul 25 '16 at 10:36

1 Answers1

19

If you look at the relevant isocpp paper you can see that the first set you mention is now thought to be better placed in std::allocator_traits. Since the STL (not even standard library) came out, there's been more of a shift to use traits.

rebind is also a relic. When the STL first came out, aliases and template-template parameters were not supported. With these language features in existence, rebind seems fairly convoluted. E.g., as you can see in an answer to this question, in The C++ Programming Language, 4th edition, section 34.4.1, p. 998, commenting the 'classical' rebind member in default allocator class :

template<typename U>
     struct rebind { using other = allocator<U>;};

Bjarne Stroustupr writes this : "The curious rebind template is an archaic alias. It should have been:

template<typename U>
using other = allocator<U>;

However, allocator was defined before such aliases were supported by C++."

So, altogether, it's the standard library catching up with the language and paradigm shifts.

Community
  • 1
  • 1
Ami Tavory
  • 74,578
  • 11
  • 141
  • 185