Boost logo

Boost-Commit :

From: dgregor_at_[hidden]
Date: 2008-05-18 17:26:17


Author: dgregor
Date: 2008-05-18 17:26:16 EDT (Sun, 18 May 2008)
New Revision: 45499
URL: http://svn.boost.org/trac/boost/changeset/45499

Log:
Allocator support for containers
Text files modified:
   sandbox/committee/concepts/stdlib/clib-containers.tex | 1658 ++++++++++++++++++++-------------------
   1 files changed, 853 insertions(+), 805 deletions(-)

Modified: sandbox/committee/concepts/stdlib/clib-containers.tex
==============================================================================
--- sandbox/committee/concepts/stdlib/clib-containers.tex (original)
+++ sandbox/committee/concepts/stdlib/clib-containers.tex 2008-05-18 17:26:16 EDT (Sun, 18 May 2008)
@@ -1169,27 +1169,27 @@
 
 \begin{codeblock}
 namespace std {
- template <@\changedConcepts{class}{ObjectType}@ T, class Allocator = allocator<T> >
+ template <@\changedConcepts{class}{ObjectType}@ T, @\changedConcepts{class}{RandomAccessAllocator}@ Alloc@\removedConcepts{ator}@ = allocator<T> >
     @\addedConcepts{requires Destructible<T>}@
     class deque;
- template <@\changedConcepts{class}{EqualityComparable}@ T, class Allocator>
- bool operator==(const deque<T,Allocator>& x, const deque<T,Allocator>& y);
- template <@\changedConcepts{class}{LessThanComparable}@ T, class Allocator>
- bool operator<(const deque<T,Allocator>& x, const deque<T,Allocator>& y);
- template <@\changedConcepts{class}{EqualityComparable}@ T, class Allocator>
- bool operator!=(const deque<T,Allocator>& x, const deque<T,Allocator>& y);
- template <@\changedConcepts{class}{LessThanComparable}@ T, class Allocator>
- bool operator>(const deque<T,Allocator>& x, const deque<T,Allocator>& y);
- template <@\changedConcepts{class}{LessThanComparable}@ T, class Allocator>
- bool operator>=(const deque<T,Allocator>& x, const deque<T,Allocator>& y);
- template <@\changedConcepts{class}{LessThanComparable}@ T, class Allocator>
- bool operator<=(const deque<T,Allocator>& x, const deque<T,Allocator>& y);
- template <@\changedConcepts{class}{ObjectType}@ T, class Allocator>
- void swap(deque<T,Allocator>& x, deque<T,Allocator>& y);
- template <@\changedConcepts{class}{ObjectType}@ T, class Allocator>
- void swap(deque<T,Allocator>&& x, deque<T,Allocator>& y);
- template <@\changedConcepts{class}{ObjectType}@ T, class Allocator>
- void swap(deque<T,Allocator>& x, deque<T,Allocator>&& y);
+ template <@\changedConcepts{class}{EqualityComparable}@ T, class Alloc@\removedConcepts{ator}@>
+ bool operator==(const deque<T,Alloc@\removedConcepts{ator}@>& x, const deque<T,Alloc@\removedConcepts{ator}@>& y);
+ template <@\changedConcepts{class}{LessThanComparable}@ T, class Alloc@\removedConcepts{ator}@>
+ bool operator<(const deque<T,Alloc@\removedConcepts{ator}@>& x, const deque<T,Alloc@\removedConcepts{ator}@>& y);
+ template <@\changedConcepts{class}{EqualityComparable}@ T, class Alloc@\removedConcepts{ator}@>
+ bool operator!=(const deque<T,Alloc@\removedConcepts{ator}@>& x, const deque<T,Alloc@\removedConcepts{ator}@>& y);
+ template <@\changedConcepts{class}{LessThanComparable}@ T, class Alloc@\removedConcepts{ator}@>
+ bool operator>(const deque<T,Alloc@\removedConcepts{ator}@>& x, const deque<T,Alloc@\removedConcepts{ator}@>& y);
+ template <@\changedConcepts{class}{LessThanComparable}@ T, class Alloc@\removedConcepts{ator}@>
+ bool operator>=(const deque<T,Alloc@\removedConcepts{ator}@>& x, const deque<T,Alloc@\removedConcepts{ator}@>& y);
+ template <@\changedConcepts{class}{LessThanComparable}@ T, class Alloc@\removedConcepts{ator}@>
+ bool operator<=(const deque<T,Alloc@\removedConcepts{ator}@>& x, const deque<T,Alloc@\removedConcepts{ator}@>& y);
+ template <@\changedConcepts{class}{ObjectType}@ T, class Alloc@\removedConcepts{ator}@>
+ void swap(deque<T,Alloc@\removedConcepts{ator}@>& x, deque<T,Alloc@\removedConcepts{ator}@>& y);
+ template <@\changedConcepts{class}{ObjectType}@ T, class Alloc@\removedConcepts{ator}@>
+ void swap(deque<T,Alloc@\removedConcepts{ator}@>&& x, deque<T,Alloc@\removedConcepts{ator}@>& y);
+ template <@\changedConcepts{class}{ObjectType}@ T, class Alloc@\removedConcepts{ator}@>
+ void swap(deque<T,Alloc@\removedConcepts{ator}@>& x, deque<T,Alloc@\removedConcepts{ator}@>&& y);
 }
 \end{codeblock}
 
@@ -1198,23 +1198,23 @@
 
 \begin{codeblock}
 namespace std {
- template <@\changedConcepts{class}{ObjectType}@ T, class Allocator = allocator<T> >
+ template <@\changedConcepts{class}{ObjectType}@ T, @\changedConcepts{class}{Allocator}@ Alloc@\removedConcepts{ator}@ = allocator<T> >
     @\addedConcepts{requires Destructible<T>}@
     class forward_list;
- template <@\changedConcepts{class}{EqualityComparable}@ T, class Allocator>
- bool operator==(const forward_list<T,Allocator>& x, const forward_list<T,Allocator>& y);
- template <@\changedConcepts{class}{LessThanComparable}@ T, class Allocator>
- bool operator< (const forward_list<T,Allocator>& x, const forward_list<T,Allocator>& y);
- template <@\changedConcepts{class}{EqualityComparable}@ T, class Allocator>
- bool operator!=(const forward_list<T,Allocator>& x, const forward_list<T,Allocator>& y);
- template <@\changedConcepts{class}{LessThanComparable}@ T, class Allocator>
- bool operator> (const forward_list<T,Allocator>& x, const forward_list<T,Allocator>& y);
- template <@\changedConcepts{class}{LessThanComparable}@ T, class Allocator>
- bool operator>=(const forward_list<T,Allocator>& x, const forward_list<T,Allocator>& y);
- template <@\changedConcepts{class}{LessThanComparable}@ T, class Allocator>
- bool operator<=(const forward_list<T,Allocator>& x, const forward_list<T,Allocator>& y);
- template <@\changedConcepts{class}{ObjectType}@ T, class Allocator>
- void swap(forward_list<T,Allocator>& x, forward_list<T,Allocator>& y);
+ template <@\changedConcepts{class}{EqualityComparable}@ T, class Alloc@\removedConcepts{ator}@>
+ bool operator==(const forward_list<T,Alloc@\removedConcepts{ator}@>& x, const forward_list<T,Alloc@\removedConcepts{ator}@>& y);
+ template <@\changedConcepts{class}{LessThanComparable}@ T, class Alloc@\removedConcepts{ator}@>
+ bool operator< (const forward_list<T,Alloc@\removedConcepts{ator}@>& x, const forward_list<T,Alloc@\removedConcepts{ator}@>& y);
+ template <@\changedConcepts{class}{EqualityComparable}@ T, class Alloc@\removedConcepts{ator}@>
+ bool operator!=(const forward_list<T,Alloc@\removedConcepts{ator}@>& x, const forward_list<T,Alloc@\removedConcepts{ator}@>& y);
+ template <@\changedConcepts{class}{LessThanComparable}@ T, class Alloc@\removedConcepts{ator}@>
+ bool operator> (const forward_list<T,Alloc@\removedConcepts{ator}@>& x, const forward_list<T,Alloc@\removedConcepts{ator}@>& y);
+ template <@\changedConcepts{class}{LessThanComparable}@ T, class Alloc@\removedConcepts{ator}@>
+ bool operator>=(const forward_list<T,Alloc@\removedConcepts{ator}@>& x, const forward_list<T,Alloc@\removedConcepts{ator}@>& y);
+ template <@\changedConcepts{class}{LessThanComparable}@ T, class Alloc@\removedConcepts{ator}@>
+ bool operator<=(const forward_list<T,Alloc@\removedConcepts{ator}@>& x, const forward_list<T,Alloc@\removedConcepts{ator}@>& y);
+ template <@\changedConcepts{class}{ObjectType}@ T, class Alloc@\removedConcepts{ator}@>
+ void swap(forward_list<T,Alloc@\removedConcepts{ator}@>& x, forward_list<T,Alloc@\removedConcepts{ator}@>& y);
 }
 \end{codeblock}
 
@@ -1223,27 +1223,27 @@
 
 \begin{codeblock}
 namespace std {
- template <@\changedConcepts{class}{ObjectType}@ T, class Allocator = allocator<T> >
+ template <@\changedConcepts{class}{ObjectType}@ T, @\changedConcepts{class}{Allocator}@ Alloc@\removedConcepts{ator}@ = allocator<T> >
     @\addedConcepts{requires Destructible<T>}@
     class list;
- template <@\changedConcepts{class}{EqualityComparable}@ T, class Allocator>
- bool operator==(const list<T,Allocator>& x, const list<T,Allocator>& y);
- template <@\changedConcepts{class}{LessThanComparable}@ T, class Allocator>
- bool operator< (const list<T,Allocator>& x, const list<T,Allocator>& y);
- template <@\changedConcepts{class}{EqualityComparable}@ T, class Allocator>
- bool operator!=(const list<T,Allocator>& x, const list<T,Allocator>& y);
- template <@\changedConcepts{class}{LessThanComparable}@ T, class Allocator>
- bool operator> (const list<T,Allocator>& x, const list<T,Allocator>& y);
- template <@\changedConcepts{class}{LessThanComparable}@ T, class Allocator>
- bool operator>=(const list<T,Allocator>& x, const list<T,Allocator>& y);
- template <@\changedConcepts{class}{LessThanComparable}@ T, class Allocator>
- bool operator<=(const list<T,Allocator>& x, const list<T,Allocator>& y);
- template <@\changedConcepts{class}{ObjectType}@ T, class Allocator>
- void swap(list<T,Allocator>& x, list<T,Allocator>& y);
- template <@\changedConcepts{class}{ObjectType}@ T, class Allocator>
- void swap(list<T,Allocator>&& x, list<T,Allocator>& y);
- template <@\changedConcepts{class}{ObjectType}@ T, class Allocator>
- void swap(list<T,Allocator>& x, list<T,Allocator>&& y);
+ template <@\changedConcepts{class}{EqualityComparable}@ T, class Alloc@\removedConcepts{ator}@>
+ bool operator==(const list<T,Alloc@\removedConcepts{ator}@>& x, const list<T,Alloc@\removedConcepts{ator}@>& y);
+ template <@\changedConcepts{class}{LessThanComparable}@ T, class Alloc@\removedConcepts{ator}@>
+ bool operator< (const list<T,Alloc@\removedConcepts{ator}@>& x, const list<T,Alloc@\removedConcepts{ator}@>& y);
+ template <@\changedConcepts{class}{EqualityComparable}@ T, class Alloc@\removedConcepts{ator}@>
+ bool operator!=(const list<T,Alloc@\removedConcepts{ator}@>& x, const list<T,Alloc@\removedConcepts{ator}@>& y);
+ template <@\changedConcepts{class}{LessThanComparable}@ T, class Alloc@\removedConcepts{ator}@>
+ bool operator> (const list<T,Alloc@\removedConcepts{ator}@>& x, const list<T,Alloc@\removedConcepts{ator}@>& y);
+ template <@\changedConcepts{class}{LessThanComparable}@ T, class Alloc@\removedConcepts{ator}@>
+ bool operator>=(const list<T,Alloc@\removedConcepts{ator}@>& x, const list<T,Alloc@\removedConcepts{ator}@>& y);
+ template <@\changedConcepts{class}{LessThanComparable}@ T, class Alloc@\removedConcepts{ator}@>
+ bool operator<=(const list<T,Alloc@\removedConcepts{ator}@>& x, const list<T,Alloc@\removedConcepts{ator}@>& y);
+ template <@\changedConcepts{class}{ObjectType}@ T, class Alloc@\removedConcepts{ator}@>
+ void swap(list<T,Alloc@\removedConcepts{ator}@>& x, list<T,Alloc@\removedConcepts{ator}@>& y);
+ template <@\changedConcepts{class}{ObjectType}@ T, class Alloc@\removedConcepts{ator}@>
+ void swap(list<T,Alloc@\removedConcepts{ator}@>&& x, list<T,Alloc@\removedConcepts{ator}@>& y);
+ template <@\changedConcepts{class}{ObjectType}@ T, class Alloc@\removedConcepts{ator}@>
+ void swap(list<T,Alloc@\removedConcepts{ator}@>& x, list<T,Alloc@\removedConcepts{ator}@>&& y);
 }
 \end{codeblock}
 
@@ -1268,24 +1268,24 @@
     bool operator>=(const queue<T, Cont@\removedConcepts{ainer}@>& x,const queue<T, Cont@\removedConcepts{ainer}@>& y);
   template <class T, @\changedConcepts{class}{LessThanComparable}@ Cont@\removedConcepts{ainer}@>
     bool operator<=(const queue<T, Cont@\removedConcepts{ainer}@>& x,const queue<T, Cont@\removedConcepts{ainer}@>& y);
- template <@\changedConcepts{class}{ObjectType}@ T, class Allocator>
- void swap(queue<T,Allocator>& x, queue<T,Allocator>& y);
- template <@\changedConcepts{class}{ObjectType}@ T, class Allocator>
- void swap(queue<T,Allocator>&& x, queue<T,Allocator>& y);
- template <@\changedConcepts{class}{ObjectType}@ T, class Allocator>
- void swap(queue<T,Allocator>& x, queue<T,Allocator>&& y);
+ template <@\changedConcepts{class}{ObjectType}@ T, class Alloc@\removedConcepts{ator}@>
+ void swap(queue<T,Alloc@\removedConcepts{ator}@>& x, queue<T,Alloc@\removedConcepts{ator}@>& y);
+ template <@\changedConcepts{class}{ObjectType}@ T, class Alloc@\removedConcepts{ator}@>
+ void swap(queue<T,Alloc@\removedConcepts{ator}@>&& x, queue<T,Alloc@\removedConcepts{ator}@>& y);
+ template <@\changedConcepts{class}{ObjectType}@ T, class Alloc@\removedConcepts{ator}@>
+ void swap(queue<T,Alloc@\removedConcepts{ator}@>& x, queue<T,Alloc@\removedConcepts{ator}@>&& y);
 
   template <@\changedConcepts{class}{ObjectType}@ T, @\changedConcepts{class}{BackInsertionSequence}@ Cont@\removedConcepts{ainer}@ = vector<T>,
         @\changedConcepts{class}{Predicate<auto, T, T>}@ Compare = less<typename Cont@\removedConcepts{ainer}@::value_type> >
     @\addedConcepts{requires SameType<Cont::value_type, T> \&\& MutableRandomAccessIterator<Cont::iterator>}@
              @\addedConcepts{\&\& SwappableIterator<Cont::iterator> \&\& CopyConstructible<Compare>}@
   class priority_queue;
- template <@\changedConcepts{class}{ObjectType}@ T, class Allocator@\addedConcepts{, Swappable Compare}@>
- void swap(priority_queue<T,Allocator>& x, priority_queue<T,Allocator>& y);
- template <@\changedConcepts{class}{ObjectType}@ T, class Allocator@\addedConcepts{, Swappable Compare}@>
- void swap(priority_queue<T,Allocator>&& x, priority_queue<T,Allocator>& y);
- template <@\changedConcepts{class}{ObjectType}@ T, class Allocator@\addedConcepts{, Swappable Compare}@>
- void swap(priority_queue<T,Allocator>& x, priority_queue<T,Allocator>&& y);
+ template <@\changedConcepts{class}{ObjectType}@ T, class Alloc@\removedConcepts{ator}@@\addedConcepts{, Swappable Compare}@>
+ void swap(priority_queue<T,Alloc@\removedConcepts{ator}@>& x, priority_queue<T,Alloc@\removedConcepts{ator}@>& y);
+ template <@\changedConcepts{class}{ObjectType}@ T, class Alloc@\removedConcepts{ator}@@\addedConcepts{, Swappable Compare}@>
+ void swap(priority_queue<T,Alloc@\removedConcepts{ator}@>&& x, priority_queue<T,Alloc@\removedConcepts{ator}@>& y);
+ template <@\changedConcepts{class}{ObjectType}@ T, class Alloc@\removedConcepts{ator}@@\addedConcepts{, Swappable Compare}@>
+ void swap(priority_queue<T,Alloc@\removedConcepts{ator}@>& x, priority_queue<T,Alloc@\removedConcepts{ator}@>&& y);
 }
 \end{codeblock}
 
@@ -1309,12 +1309,12 @@
     bool operator>=(const stack<T, Cont@\removedConcepts{ainer}@>& x,const stack<T, Cont@\removedConcepts{ainer}@>& y);
   template <@\changedConcepts{class}{LessThanComparable}@ T, class Cont@\removedConcepts{ainer}@>
     bool operator<=(const stack<T, Cont@\removedConcepts{ainer}@>& x,const stack<T, Cont@\removedConcepts{ainer}@>& y);
- template <@\changedConcepts{class}{ObjectType}@ T, class Allocator>
- void swap(stack<T,Allocator>& x, stack<T,Allocator>& y);
- template <@\changedConcepts{class}{ObjectType}@ T, class Allocator>
- void swap(stack<T,Allocator>&& x, stack<T,Allocator>& y);
- template <@\changedConcepts{class}{ObjectType}@ T, class Allocator>
- void swap(stack<T,Allocator>& x, stack<T,Allocator>&& y);
+ template <@\changedConcepts{class}{ObjectType}@ T, class Alloc@\removedConcepts{ator}@>
+ void swap(stack<T,Alloc@\removedConcepts{ator}@>& x, stack<T,Alloc@\removedConcepts{ator}@>& y);
+ template <@\changedConcepts{class}{ObjectType}@ T, class Alloc@\removedConcepts{ator}@>
+ void swap(stack<T,Alloc@\removedConcepts{ator}@>&& x, stack<T,Alloc@\removedConcepts{ator}@>& y);
+ template <@\changedConcepts{class}{ObjectType}@ T, class Alloc@\removedConcepts{ator}@>
+ void swap(stack<T,Alloc@\removedConcepts{ator}@>& x, stack<T,Alloc@\removedConcepts{ator}@>&& y);
 }
 \end{codeblock}
 
@@ -1323,29 +1323,29 @@
 
 \begin{codeblock}
 namespace std {
- template <@\changedConcepts{class}{ObjectType}@ T, class Allocator = allocator<T> >
+ template <@\changedConcepts{class}{ObjectType}@ T, @\changedConcepts{class}{RandomAccessAllocator}@ Alloc@\removedConcepts{ator}@ = allocator<T> >
     @\addedConcepts{requires Destructible<T>}@
     class vector;
- template <@\changedConcepts{class}{EqualityComparable}@ T, class Allocator>
- bool operator==(const vector<T,Allocator>& x,const vector<T,Allocator>& y);
- template <@\changedConcepts{class}{LessThanComparable}@ T, class Allocator>
- bool operator< (const vector<T,Allocator>& x,const vector<T,Allocator>& y);
- template <@\changedConcepts{class}{EqualityComparable}@ T, class Allocator>
- bool operator!=(const vector<T,Allocator>& x,const vector<T,Allocator>& y);
- template <@\changedConcepts{class}{LessThanComparable}@ T, class Allocator>
- bool operator> (const vector<T,Allocator>& x,const vector<T,Allocator>& y);
- template <@\changedConcepts{class}{LessThanComparable}@ T, class Allocator>
- bool operator>=(const vector<T,Allocator>& x,const vector<T,Allocator>& y);
- template <@\changedConcepts{class}{LessThanComparable}@ T, class Allocator>
- bool operator<=(const vector<T,Allocator>& x,const vector<T,Allocator>& y);
- template <@\changedConcepts{class}{ObjectType}@ T, class Allocator>
- void swap(vector<T,Allocator>& x, vector<T,Allocator>& y);
- template <@\changedConcepts{class}{ObjectType}@ T, class Allocator>
- void swap(vector<T,Allocator>&& x, vector<T,Allocator>& y);
- template <@\changedConcepts{class}{ObjectType}@ T, class Allocator>
- void swap(vector<T,Allocator>& x, vector<T,Allocator>&& y);
+ template <@\changedConcepts{class}{EqualityComparable}@ T, class Alloc@\removedConcepts{ator}@>
+ bool operator==(const vector<T,Alloc@\removedConcepts{ator}@>& x,const vector<T,Alloc@\removedConcepts{ator}@>& y);
+ template <@\changedConcepts{class}{LessThanComparable}@ T, class Alloc@\removedConcepts{ator}@>
+ bool operator< (const vector<T,Alloc@\removedConcepts{ator}@>& x,const vector<T,Alloc@\removedConcepts{ator}@>& y);
+ template <@\changedConcepts{class}{EqualityComparable}@ T, class Alloc@\removedConcepts{ator}@>
+ bool operator!=(const vector<T,Alloc@\removedConcepts{ator}@>& x,const vector<T,Alloc@\removedConcepts{ator}@>& y);
+ template <@\changedConcepts{class}{LessThanComparable}@ T, class Alloc@\removedConcepts{ator}@>
+ bool operator> (const vector<T,Alloc@\removedConcepts{ator}@>& x,const vector<T,Alloc@\removedConcepts{ator}@>& y);
+ template <@\changedConcepts{class}{LessThanComparable}@ T, class Alloc@\removedConcepts{ator}@>
+ bool operator>=(const vector<T,Alloc@\removedConcepts{ator}@>& x,const vector<T,Alloc@\removedConcepts{ator}@>& y);
+ template <@\changedConcepts{class}{LessThanComparable}@ T, class Alloc@\removedConcepts{ator}@>
+ bool operator<=(const vector<T,Alloc@\removedConcepts{ator}@>& x,const vector<T,Alloc@\removedConcepts{ator}@>& y);
+ template <@\changedConcepts{class}{ObjectType}@ T, class Alloc@\removedConcepts{ator}@>
+ void swap(vector<T,Alloc@\removedConcepts{ator}@>& x, vector<T,Alloc@\removedConcepts{ator}@>& y);
+ template <@\changedConcepts{class}{ObjectType}@ T, class Alloc@\removedConcepts{ator}@>
+ void swap(vector<T,Alloc@\removedConcepts{ator}@>&& x, vector<T,Alloc@\removedConcepts{ator}@>& y);
+ template <@\changedConcepts{class}{ObjectType}@ T, class Alloc@\removedConcepts{ator}@>
+ void swap(vector<T,Alloc@\removedConcepts{ator}@>& x, vector<T,Alloc@\removedConcepts{ator}@>&& y);
 
- template <class Allocator> class vector<bool,Allocator>;
+ template <@\changedConcepts{class}{RandomAccessAllocator}@ Alloc@\removedConcepts{ator}@> class vector<bool,Alloc@\removedConcepts{ator}@>;
 \end{codeblock}
 
 \rSec2[array]{\marktr{}Class template \tcode{array}}
@@ -1606,44 +1606,44 @@
 
 \begin{codeblock}
 namespace std {
- template <@\changedConcepts{class}{ObjectType}@ T, class Allocator = allocator<T> >
+ template <@\changedConcepts{class}{ObjectType}@ T, @\changedConcepts{class}{RandomAccessAllocator}@ Alloc@\removedConcepts{ator}@ = allocator<T> >
   @\addedConcepts{requires Destructible<T>}@
   class deque {
   public:
     // types:
- typedef typename Allocator::reference reference;
- typedef typename Allocator::const_reference const_reference;
+ typedef typename Alloc@\removedConcepts{ator}@::reference reference;
+ typedef typename Alloc@\removedConcepts{ator}@::const_reference const_reference;
     typedef @\impdef@ iterator; // See \ref{container.requirements}
     typedef @\impdef@ const_iterator; // See \ref{container.requirements}
     typedef @\impdef@ size_type; // See \ref{container.requirements}
     typedef @\impdef@ difference_type;// See \ref{container.requirements}
     typedef T value_type;
- typedef Allocator allocator_type;
- typedef typename Allocator::pointer pointer;
- typedef typename Allocator::const_pointer const_pointer;
+ typedef Alloc@\removedConcepts{ator}@ allocator_type;
+ typedef typename Alloc@\removedConcepts{ator}@::pointer pointer;
+ typedef typename Alloc@\removedConcepts{ator}@::const_pointer const_pointer;
     typedef std::reverse_iterator<iterator> reverse_iterator;
     typedef std::reverse_iterator<const_iterator> const_reverse_iterator;
 
     // \ref{deque.cons} construct/copy/destroy:
- explicit deque(const Allocator& = Allocator());
+ explicit deque(const Alloc@\removedConcepts{ator}@& = Alloc@\removedConcepts{ator}@());
     @\addedConcepts{requires DefaultConstructible<T>}@ explicit deque(size_type n);
- @\addedConcepts{requires CopyConstructible<T>}@ deque(size_type n, const T& value,const Allocator& = Allocator());
+ @\addedConcepts{requires ConstructibleAsElement<Alloc, T, const T\&>}@ deque(size_type n, const T& value,const Alloc@\removedConcepts{ator}@& = Alloc@\removedConcepts{ator}@());
     template <@\changedConcepts{class InputIterator}{InputIterator Iter}@>
       @\addedConcepts{requires HasConstructor<T, Iter::reference>}@
- deque(@\changedConcepts{InputIterator}{Iter}@ first, @\changedConcepts{InputIterator}{Iter}@ last,const Allocator& = Allocator());
- @\addedConcepts{requires CopyConstructible<T>}@ deque(const deque<T,Allocator>& x);
+ deque(@\changedConcepts{InputIterator}{Iter}@ first, @\changedConcepts{InputIterator}{Iter}@ last,const Alloc@\removedConcepts{ator}@& = Alloc@\removedConcepts{ator}@());
+ @\addedConcepts{requires ConstructibleAsElement<Alloc, T, const T\&>}@ deque(const deque<T,Alloc@\removedConcepts{ator}@>& x);
     deque(deque&&);
- @\addedConcepts{requires CopyConstructible<T>}@ deque(const deque&, const Allocator&);
- deque(deque&&, const Allocator&);
+ @\addedConcepts{requires ConstructibleAsElement<Alloc, T, const T\&>}@ deque(const deque&, const Alloc@\removedConcepts{ator}@&);
+ deque(deque&&, const Alloc@\removedConcepts{ator}@&);
 
    ~deque();
- @\addedConcepts{requires CopyConstructible<T> \&\& CopyAssignable<T>}@
- deque<T,Allocator>& operator=(const deque<T,Allocator>& x);
- deque<T,Allocator>& operator=(const deque<T,Allocator>&& x);
+ @\addedConcepts{requires ConstructibleAsElement<Alloc, T, const T\&> \&\& CopyAssignable<T>}@
+ deque<T,Alloc@\removedConcepts{ator}@>& operator=(const deque<T,Alloc@\removedConcepts{ator}@>& x);
+ deque<T,Alloc@\removedConcepts{ator}@>& operator=(const deque<T,Alloc@\removedConcepts{ator}@>&& x);
     template <@\changedConcepts{class InputIterator}{InputIterator Iter}@>
       @\addedConcepts{requires HasConstructor<T, Iter::reference> \&\& CopyAssignable<T, Iter::reference>}@
       void assign(InputIterator first, InputIterator last);
- @\addedConcepts{requires CopyAssignable<T> \&\& CopyConstructible<T>}@ void assign(size_type n, const T& t);
+ @\addedConcepts{requires CopyAssignable<T> \&\& ConstructibleAsElement<Alloc, T, const T\&>}@ void assign(size_type n, const T& t);
     allocator_type get_allocator() const;
 
     // iterators:
@@ -1666,7 +1666,7 @@
     size_type max_size() const;
     @\addedConcepts{requires DefaultConstructible<T> \&\& MoveAssignable<T>}@
       void resize(size_type sz);
- @\addedConcepts{requires CopyConstructible<T> \&\& MoveAssignable<T>}@
+ @\addedConcepts{requires ConstructibleAsElement<Alloc, T, const T\&> \&\& MoveAssignable<T>}@
       void resize(size_type sz, const T& c);
     bool empty() const;
 
@@ -1692,11 +1692,11 @@
       @\addedConcepts{requires HasConstructor<T, Args\&\&...> \&\& MoveAssignable<T>}@
       iterator emplace(const_iterator position, Args&&... args);
 
- @\addedConcepts{requires CopyConstructible<T> \&\& CopyAssignable<T>}@
+ @\addedConcepts{requires ConstructibleAsElement<Alloc, T, const T\&> \&\& CopyAssignable<T>}@
       iterator insert(const_iterator position, const T& x);
- @\addedConcepts{requires MoveConstructible<T> \&\& MoveAssignable<T>}@
+ @\addedConcepts{requires ConstructibleAsElement<Alloc, T, T\&\&> \&\& MoveAssignable<T>}@
       iterator insert(const_iterator position, T&& x);
- @\addedConcepts{requires CopyConstructible<T> \&\& CopyAssignable<T>}@
+ @\addedConcepts{requires ConstructibleAsElement<Alloc, T, const T\&> \&\& CopyAssignable<T>}@
       void insert(const_iterator position, size_type n, const T& x);
     template <@\changedConcepts{class InputIterator}{InputIterator Iter}@>
       @\addedConcepts{requires HasCopyAssign<T, Iter::reference> \&\& HasConstructor<T, Iter::reference>}@
@@ -1708,41 +1708,41 @@
 
     @\addedConcepts{requires MoveAssignable<T>}@ iterator erase(const_iterator position);
     @\addedConcepts{requires MoveAssignable<T>}@ iterator erase(const_iterator first, const_iterator last);
- void swap(deque<T,Allocator>&&);
+ void swap(deque<T,Alloc@\removedConcepts{ator}@>&&);
     void clear();
   };
 
- template <@\changedConcepts{class}{EqualityComparable}@ T, class Allocator>
- bool operator==(const deque<T,Allocator>& x, const deque<T,Allocator>& y);
- template <@\changedConcepts{class}{LessThanComparable}@ T, class Allocator>
- bool operator< (const deque<T,Allocator>& x, const deque<T,Allocator>& y);
- template <@\changedConcepts{class}{EqualityComparable}@ T, class Allocator>
- bool operator!=(const deque<T,Allocator>& x, const deque<T,Allocator>& y);
- template <@\changedConcepts{class}{LessThanComparable}@ T, class Allocator>
- bool operator> (const deque<T,Allocator>& x, const deque<T,Allocator>& y);
- template <@\changedConcepts{class}{LessThanComparable}@ T, class Allocator>
- bool operator>=(const deque<T,Allocator>& x, const deque<T,Allocator>& y);
- template <@\changedConcepts{class}{LessThanComparable}@ T, class Allocator>
- bool operator<=(const deque<T,Allocator>& x, const deque<T,Allocator>& y);
+ template <@\changedConcepts{class}{EqualityComparable}@ T, class Alloc@\removedConcepts{ator}@>
+ bool operator==(const deque<T,Alloc@\removedConcepts{ator}@>& x, const deque<T,Alloc@\removedConcepts{ator}@>& y);
+ template <@\changedConcepts{class}{LessThanComparable}@ T, class Alloc@\removedConcepts{ator}@>
+ bool operator< (const deque<T,Alloc@\removedConcepts{ator}@>& x, const deque<T,Alloc@\removedConcepts{ator}@>& y);
+ template <@\changedConcepts{class}{EqualityComparable}@ T, class Alloc@\removedConcepts{ator}@>
+ bool operator!=(const deque<T,Alloc@\removedConcepts{ator}@>& x, const deque<T,Alloc@\removedConcepts{ator}@>& y);
+ template <@\changedConcepts{class}{LessThanComparable}@ T, class Alloc@\removedConcepts{ator}@>
+ bool operator> (const deque<T,Alloc@\removedConcepts{ator}@>& x, const deque<T,Alloc@\removedConcepts{ator}@>& y);
+ template <@\changedConcepts{class}{LessThanComparable}@ T, class Alloc@\removedConcepts{ator}@>
+ bool operator>=(const deque<T,Alloc@\removedConcepts{ator}@>& x, const deque<T,Alloc@\removedConcepts{ator}@>& y);
+ template <@\changedConcepts{class}{LessThanComparable}@ T, class Alloc@\removedConcepts{ator}@>
+ bool operator<=(const deque<T,Alloc@\removedConcepts{ator}@>& x, const deque<T,Alloc@\removedConcepts{ator}@>& y);
 
   // specialized algorithms:
- template <@\changedConcepts{class}{ObjectType}@ T, class Allocator>
- void swap(deque<T,Allocator>& x, deque<T,Allocator>& y);
- template <@\changedConcepts{class}{ObjectType}@ T, class Allocator>
- void swap(deque<T,Allocator>&& x, deque<T,Allocator>& y);
- template <@\changedConcepts{class}{ObjectType}@ T, class Allocator>
- void swap(deque<T,Allocator>& x, deque<T,Allocator>&& y);
-
- template <class T, class Alloc
- struct constructible_with_allocator_suffix<deque<T, Alloc> >
- : true_type { };
+ template <@\changedConcepts{class}{ObjectType}@ T, class Alloc@\removedConcepts{ator}@>
+ void swap(deque<T,Alloc@\removedConcepts{ator}@>& x, deque<T,Alloc@\removedConcepts{ator}@>& y);
+ template <@\changedConcepts{class}{ObjectType}@ T, class Alloc@\removedConcepts{ator}@>
+ void swap(deque<T,Alloc@\removedConcepts{ator}@>&& x, deque<T,Alloc@\removedConcepts{ator}@>& y);
+ template <@\changedConcepts{class}{ObjectType}@ T, class Alloc@\removedConcepts{ator}@>
+ void swap(deque<T,Alloc@\removedConcepts{ator}@>& x, deque<T,Alloc@\removedConcepts{ator}@>&& y);
+
+ @\removedConcepts{template <class T, class Alloc}@
+ @\removedConcepts{struct constructible_with_allocator_suffix<deque<T, Alloc> >}@
+ @\removedConcepts{: true_type \{ \};}@
 }
 \end{codeblock}
 
 \rSec3[deque.cons]{\tcode{deque}\ constructors, copy, and assignment}
 
 \begin{itemdecl}
-explicit deque(const Allocator& = Allocator());
+explicit deque(const Alloc@\removedConcepts{ator}@& = Alloc@\removedConcepts{ator}@());
 \end{itemdecl}
 
 \begin{itemdescr}
@@ -1774,9 +1774,9 @@
 \end{itemdescr}
 
 \begin{itemdecl}
-@\addedConcepts{requires CopyConstructible<T>}@
+@\addedConcepts{requires ConstructibleAsElement<Alloc, T, const T\&>}@
 deque(size_type @\farg{n}@, const T& @\farg{value}@,
- const Allocator& = Allocator());
+ const Alloc@\removedConcepts{ator}@& = Alloc@\removedConcepts{ator}@());
 \end{itemdecl}
 
 \begin{itemdescr}
@@ -1799,7 +1799,7 @@
 template <@\changedConcepts{class InputIterator}{InputIterator Iter}@>
   @\addedConcepts{requires HasConstructor<T, Iter::reference>}@
   deque(@\changedConcepts{InputIterator}{Iter}@ @\farg{first}@, @\changedConcepts{InputIterator}{Iter}@ @\farg{last}@,
- const Allocator& = Allocator());
+ const Alloc@\removedConcepts{ator}@& = Alloc@\removedConcepts{ator}@());
 \end{itemdecl}
 
 \begin{itemdescr}
@@ -1833,7 +1833,7 @@
 \end{itemdescr}
 
 \begin{itemdecl}
-@\addedConcepts{requires CopyConstructible<T> \&\& CopyAssignable<T>}@
+@\addedConcepts{requires ConstructibleAsElement<Alloc, T, const T\&> \&\& CopyAssignable<T>}@
 void assign(size_type n, const T& t);
 \end{itemdecl}
 
@@ -1868,7 +1868,7 @@
 
 \index{resize@\tcode{resize}!\tcode{deque}}%
 \begin{itemdecl}
-@\addedConcepts{requires CopyConstructible<T> \&\& MoveAssignable<T>}@
+@\addedConcepts{requires ConstructibleAsElement<Alloc, T, const T\&> \&\& MoveAssignable<T>}@
   void resize(size_type sz, const T& c);
 \end{itemdecl}
 
@@ -1896,11 +1896,11 @@
 \index{insert@\tcode{push_back}!\tcode{deque}}%
 \index{insert@\tcode{emplace}!\tcode{deque}}%
 \begin{itemdecl}
-@\addedConcepts{requires CopyConstructible<T> \&\& CopyAssignable<T>}@
+@\addedConcepts{requires ConstructibleAsElement<Alloc, T, const T\&> \&\& CopyAssignable<T>}@
   iterator insert(const_iterator position, const T& x);
-@\addedConcepts{requires MoveConstructible<T> \&\& MoveAssignable<T>}@
+@\addedConcepts{requires ConstructibleAsElement<Alloc, T, T\&\&> \&\& MoveAssignable<T>}@
   iterator insert(const_iterator position, T&& x);
-@\addedConcepts{requires CopyConstructible<T> \&\& CopyAssignable<T>}@
+@\addedConcepts{requires ConstructibleAsElement<Alloc, T, const T\&> \&\& CopyAssignable<T>}@
   void insert(const_iterator position, size_type n, const T& x);
 template <@\changedConcepts{class InputIterator}{InputIterator Iter}@>
   @\addedConcepts{requires HasCopyAssign<T, Iter::reference> \&\& HasConstructor<T, Iter::reference>}@
@@ -1973,12 +1973,12 @@
 \rSec3[deque.special]{\tcode{deque}\ specialized algorithms}
 
 \begin{itemdecl}
-template <@\changedConcepts{class}{ObjectType}@ T, class Allocator>
- void swap(deque<T,Allocator>& x, deque<T,Allocator>& y);
-template <@\changedConcepts{class}{ObjectType}@ T, class Allocator>
- void swap(deque<T,Allocator>&& x, deque<T,Allocator>& y);
-template <@\changedConcepts{class}{ObjectType}@ T, class Allocator>
- void swap(deque<T,Allocator>& x, deque<T,Allocator>&& y);
+template <@\changedConcepts{class}{ObjectType}@ T, class Alloc@\removedConcepts{ator}@>
+ void swap(deque<T,Alloc@\removedConcepts{ator}@>& x, deque<T,Alloc@\removedConcepts{ator}@>& y);
+template <@\changedConcepts{class}{ObjectType}@ T, class Alloc@\removedConcepts{ator}@>
+ void swap(deque<T,Alloc@\removedConcepts{ator}@>&& x, deque<T,Alloc@\removedConcepts{ator}@>& y);
+template <@\changedConcepts{class}{ObjectType}@ T, class Alloc@\removedConcepts{ator}@>
+ void swap(deque<T,Alloc@\removedConcepts{ator}@>& x, deque<T,Alloc@\removedConcepts{ator}@>&& y);
 \end{itemdecl}
 
 \begin{itemdescr}
@@ -1999,42 +1999,42 @@
 
 \begin{codeblock}
 namespace std {
- template <@\changedConcepts{class}{ObjectType}@ T, class Allocator = allocator<T> >
+ template <@\changedConcepts{class}{ObjectType}@ T, @\changedConcepts{class}{Allocator}@ Alloc@\removedConcepts{ator}@ = allocator<T> >
   @\addedConcepts{requires Destructible<T>}@
   class forward_list {
   public:
     // types:
- typedef typename Allocator::reference reference;
- typedef typename Allocator::const_reference const_reference;
+ typedef typename Alloc@\removedConcepts{ator}@::reference reference;
+ typedef typename Alloc@\removedConcepts{ator}@::const_reference const_reference;
     typedef @\impdef@ iterator; // See 23.1
     typedef @\impdef@ const_iterator; // See 23.1
     typedef @\impdef@ size_type; // See 23.1
     typedef @\impdef@ difference_type;// See 23.1
     typedef T value_type;
- typedef Allocator allocator_type;
- typedef typename Allocator::pointer pointer;
- typedef typename Allocator::const_pointer const_pointer;
+ typedef Alloc@\removedConcepts{ator}@ allocator_type;
+ typedef typename Alloc@\removedConcepts{ator}@::pointer pointer;
+ typedef typename Alloc@\removedConcepts{ator}@::const_pointer const_pointer;
 
     // \ref{forwardlist.cons} construct/copy/destroy:
- explicit forward_list(const Allocator& = Allocator());
+ explicit forward_list(const Alloc@\removedConcepts{ator}@& = Alloc@\removedConcepts{ator}@());
     @\addedConcepts{requires DefaultConstructible<T>}@ explicit forward_list(size_type n);
- @\addedConcepts{requires CopyConstructible<T>}@
+ @\addedConcepts{requires ConstructibleAsElement<Alloc, T, const T\&>}@
       forward_list(size_type n, const T& value,
- const Allocator& = Allocator());
+ const Alloc@\removedConcepts{ator}@& = Alloc@\removedConcepts{ator}@());
     template <@\changedConcepts{class InputIterator}{InputIterator Iter}@>
       @\addedConcepts{HasConstructor<T, Iter::reference>}@
       forward_list(@\changedConcepts{InputIterator}{Iter}@ first, @\changedConcepts{InputIterator}{Iter}@ last,
- const Allocator& = Allocator());
- @\addedConcepts{requires CopyConstructible<T>}@ forward_list(const forward_list<T,Allocator>& x);
- forward_list(forward_list<T,Allocator>&& x);
+ const Alloc@\removedConcepts{ator}@& = Alloc@\removedConcepts{ator}@());
+ @\addedConcepts{requires ConstructibleAsElement<Alloc, T, const T\&>}@ forward_list(const forward_list<T,Alloc@\removedConcepts{ator}@>& x);
+ forward_list(forward_list<T,Alloc@\removedConcepts{ator}@>&& x);
     ~forward_list();
     @\addedConcepts{requires CopyAssignable<T>}@
- forward_list<T,Allocator>& operator=(const forward_list<T,Allocator>& x);
- forward_list<T,Allocator>& operator=(forward_list<T,Allocator>&& x);
+ forward_list<T,Alloc@\removedConcepts{ator}@>& operator=(const forward_list<T,Alloc@\removedConcepts{ator}@>& x);
+ forward_list<T,Alloc@\removedConcepts{ator}@>& operator=(forward_list<T,Alloc@\removedConcepts{ator}@>&& x);
     template <@\changedConcepts{class InputIterator}{InputIterator Iter}@>
       @\addedConcepts{requires HasConstructor<T, Iter::reference>}@
       void assign(@\changedConcepts{InputIterator}{Iter}@ first, @\changedConcepts{InputIterator}{Iter}@ last);
- @\addedConcepts{CopyConstructible<T>}@ void assign(size_type n, const T& t);
+ @\addedConcepts{ConstructibleAsElement<Alloc, T, const T\&>}@ void assign(size_type n, const T& t);
     allocator_type get_allocator() const;
 
     // \ref{forwardlist.iter} iterators:
@@ -2066,10 +2066,10 @@
     template <class... Args>
       @\addedConcepts{requires HasConstructor<T, Args\&\&...>}@
       iterator emplace_after(const_iterator position, Args&&... args);
- @\addedConcepts{requires CopyConstructible<T>}@ iterator insert_after(const_iterator position, const T& x);
- @\addedConcepts{requires MoveConstructible<T>}@ iterator insert_after(const_iterator position, T&& x);
+ @\addedConcepts{requires ConstructibleAsElement<Alloc, T, const T\&>}@ iterator insert_after(const_iterator position, const T& x);
+ @\addedConcepts{requires ConstructibleAsElement<Alloc, T, T\&\&>}@ iterator insert_after(const_iterator position, T&& x);
 
- @\addedConcepts{requires CopyConstructible<T>}@
+ @\addedConcepts{requires ConstructibleAsElement<Alloc, T, const T\&>}@
       void insert_after(const_iterator position, size_type n, const T& x);
     template <@\changedConcepts{class InputIterator}{InputIterator Iter}@>
       @\addedConcepts{requires HasConstructor<T, Iter::reference>}@
@@ -2077,17 +2077,17 @@
 
     iterator erase_after(const_iterator position);
     iterator erase_after(const_iterator position, iterator last);
- void swap(forward_list<T,Allocator>&&);
+ void swap(forward_list<T,Alloc@\removedConcepts{ator}@>&&);
 
     @\addedConcepts{requires DefaultConstructible<T>}@ void resize(size_type sz);
- @\addedConcepts{requires CopyConstructible<T>}@ void resize(size_type sz, value_type c);
+ @\addedConcepts{requires ConstructibleAsElement<Alloc, T, const T\&>}@ void resize(size_type sz, value_type c);
     void clear();
 
     // \ref{forwardlist.ops} forward_list operations:
- void splice_after(const_iterator position, forward_list<T,Allocator>&& x);
- void splice_after(const_iterator position, forward_list<T,Allocator>&& x,
+ void splice_after(const_iterator position, forward_list<T,Alloc@\removedConcepts{ator}@>&& x);
+ void splice_after(const_iterator position, forward_list<T,Alloc@\removedConcepts{ator}@>&& x,
                       const_iterator i);
- void splice_after(const_iterator position, forward_list<T,Allocator>&& x,
+ void splice_after(const_iterator position, forward_list<T,Alloc@\removedConcepts{ator}@>&& x,
                       const_iterator first, const_iterator last);
 
     @\addedConcepts{requires EqualityComparable<T>}@ void remove(const T& value);
@@ -2097,9 +2097,9 @@
     template <@\changedConcepts{class}{Predicate<auto, T, T>}@ BinaryPredicate>
       void unique(BinaryPredicate binary_pred);
 
- @\addedConcepts{requires LessThanComparable<T>}@ void merge(forward_list<T,Allocator>&& x);
+ @\addedConcepts{requires LessThanComparable<T>}@ void merge(forward_list<T,Alloc@\removedConcepts{ator}@>&& x);
     template <@\changedConcepts{class}{Predicate<auto, T, T>}@ Compare>
- void merge(forward_list<T,Allocator>&& x, Compare comp);
+ void merge(forward_list<T,Alloc@\removedConcepts{ator}@>&& x, Compare comp);
 
     @\addedConcepts{requires LessThanComparable<T>}@ void sort();
     template <@\changedConcepts{class}{Predicate<auto, T, T>}@ Compare> void sort(Compare comp);
@@ -2108,33 +2108,33 @@
   };
 
   // Comparison operators
- template <@\changedConcepts{class}{EqualityComparable}@ T, class Allocator>
- bool operator==(const forward_list<T,Allocator>& x, const forward_list<T,Allocator>& y);
- template <@\changedConcepts{class}{LessThanComparable}@ T, class Allocator>
- bool operator< (const forward_list<T,Allocator>& x, const forward_list<T,Allocator>& y);
- template <@\changedConcepts{class}{EqualityComparable}@ T, class Allocator>
- bool operator!=(const forward_list<T,Allocator>& x, const forward_list<T,Allocator>& y);
- template <@\changedConcepts{class}{LessThanComparable}@ T, class Allocator>
- bool operator> (const forward_list<T,Allocator>& x, const forward_list<T,Allocator>& y);
- template <@\changedConcepts{class}{LessThanComparable}@ T, class Allocator>
- bool operator>=(const forward_list<T,Allocator>& x, const forward_list<T,Allocator>& y);
- template <@\changedConcepts{class}{LessThanComparable}@ T, class Allocator>
- bool operator<=(const forward_list<T,Allocator>& x, const forward_list<T,Allocator>& y);
+ template <@\changedConcepts{class}{EqualityComparable}@ T, class Alloc@\removedConcepts{ator}@>
+ bool operator==(const forward_list<T,Alloc@\removedConcepts{ator}@>& x, const forward_list<T,Alloc@\removedConcepts{ator}@>& y);
+ template <@\changedConcepts{class}{LessThanComparable}@ T, class Alloc@\removedConcepts{ator}@>
+ bool operator< (const forward_list<T,Alloc@\removedConcepts{ator}@>& x, const forward_list<T,Alloc@\removedConcepts{ator}@>& y);
+ template <@\changedConcepts{class}{EqualityComparable}@ T, class Alloc@\removedConcepts{ator}@>
+ bool operator!=(const forward_list<T,Alloc@\removedConcepts{ator}@>& x, const forward_list<T,Alloc@\removedConcepts{ator}@>& y);
+ template <@\changedConcepts{class}{LessThanComparable}@ T, class Alloc@\removedConcepts{ator}@>
+ bool operator> (const forward_list<T,Alloc@\removedConcepts{ator}@>& x, const forward_list<T,Alloc@\removedConcepts{ator}@>& y);
+ template <@\changedConcepts{class}{LessThanComparable}@ T, class Alloc@\removedConcepts{ator}@>
+ bool operator>=(const forward_list<T,Alloc@\removedConcepts{ator}@>& x, const forward_list<T,Alloc@\removedConcepts{ator}@>& y);
+ template <@\changedConcepts{class}{LessThanComparable}@ T, class Alloc@\removedConcepts{ator}@>
+ bool operator<=(const forward_list<T,Alloc@\removedConcepts{ator}@>& x, const forward_list<T,Alloc@\removedConcepts{ator}@>& y);
 
   // \ref{forwardlist.spec} specialized algorithms:
- template <@\changedConcepts{class}{ObjectType}@ T, class Allocator>
- void swap(forward_list<T,Allocator>& x, forward_list<T,Allocator>& y);
- template <@\changedConcepts{class}{ObjectType}@ T, class Allocator>
- void swap(forward_list<T,Allocator>&& x, forward_list<T,Allocator>& y);
- template <@\changedConcepts{class}{ObjectType}@ T, class Allocator>
- void swap(forward_list<T,Allocator>& x, forward_list<T,Allocator>&& y);
+ template <@\changedConcepts{class}{ObjectType}@ T, class Alloc@\removedConcepts{ator}@>
+ void swap(forward_list<T,Alloc@\removedConcepts{ator}@>& x, forward_list<T,Alloc@\removedConcepts{ator}@>& y);
+ template <@\changedConcepts{class}{ObjectType}@ T, class Alloc@\removedConcepts{ator}@>
+ void swap(forward_list<T,Alloc@\removedConcepts{ator}@>&& x, forward_list<T,Alloc@\removedConcepts{ator}@>& y);
+ template <@\changedConcepts{class}{ObjectType}@ T, class Alloc@\removedConcepts{ator}@>
+ void swap(forward_list<T,Alloc@\removedConcepts{ator}@>& x, forward_list<T,Alloc@\removedConcepts{ator}@>&& y);
 }
 \end{codeblock}
 
 \rSec3[forwardlist.cons]{\tcode{forward_list} constructors, copy, assignment}
 
 \begin{itemdecl}
-explicit forward_list(const Allocator& = Allocator());
+explicit forward_list(const Alloc@\removedConcepts{ator}@& = Alloc@\removedConcepts{ator}@());
 \end{itemdecl}
 
 \begin{itemdescr}
@@ -2161,8 +2161,8 @@
 \end{itemdescr}
 
 \begin{itemdecl}
-@\addedConcepts{requires CopyConstructible<T>}@
- forward_list(size_type n, const T& value, const Allocator& = Allocator());
+@\addedConcepts{requires ConstructibleAsElement<Alloc, T, const T\&>}@
+ forward_list(size_type n, const T& value, const Alloc@\removedConcepts{ator}@& = Alloc@\removedConcepts{ator}@());
 \end{itemdecl}
 
 \begin{itemdescr}
@@ -2180,7 +2180,7 @@
 template <@\changedConcepts{class InputIterator}{InputIterator Iter}@>
   @\addedConcepts{HasConstructor<T, Iter::reference>}@
   forward_list(@\changedConcepts{InputIterator}{Iter}@ first, @\changedConcepts{InputIterator}{Iter}@ last,
- const Allocator& = Allocator());
+ const Alloc@\removedConcepts{ator}@& = Alloc@\removedConcepts{ator}@());
 \end{itemdecl}
 
 \begin{itemdescr}
@@ -2203,7 +2203,7 @@
 \end{itemdescr}
 
 \begin{itemdecl}
-@\addedConcepts{CopyConstructible<T>}@ void assign(size_type n, const T\& t);
+@\addedConcepts{ConstructibleAsElement<Alloc, T, const T\&>}@ void assign(size_type n, const T\& t);
 \end{itemdecl}
 
 \begin{itemdescr}
@@ -2263,8 +2263,8 @@
 \end{itemdescr}
 
 \begin{itemdecl}
-@\addedConcepts{requires CopyConstructible<T>}@ iterator insert_after(const_iterator position, const T& x);
-@\addedConcepts{requires MoveConstructible<T>}@ iterator insert_after(const_iterator position, T&& x);
+@\addedConcepts{requires ConstructibleAsElement<Alloc, T, const T\&>}@ iterator insert_after(const_iterator position, const T& x);
+@\addedConcepts{requires ConstructibleAsElement<Alloc, T, T\&\&>}@ iterator insert_after(const_iterator position, T&& x);
 \end{itemdecl}
 
 \begin{itemdescr}
@@ -2279,7 +2279,7 @@
 \end{itemdescr}
 
 \begin{itemdecl}
-@\addedConcepts{requires CopyConstructible<T>}@
+@\addedConcepts{requires ConstructibleAsElement<Alloc, T, const T\&>}@
   void insert_after(const_iterator position, size_type n, const T& x);
 \end{itemdecl}
 
@@ -2351,7 +2351,7 @@
 
 \begin{itemdecl}
 @\addedConcepts{requires DefaultConstructible<T>}@ void resize(size_type sz);
-@\addedConcepts{requires CopyConstructible<T>}@ void resize(size_type sz, value_type c);
+@\addedConcepts{requires ConstructibleAsElement<Alloc, T, const T\&>}@ void resize(size_type sz, value_type c);
 \end{itemdecl}
 
 \begin{itemdescr}
@@ -2371,7 +2371,7 @@
 \rSec3[forwardlist.ops]{\tcode{forward_list} operations}
 
 \begin{itemdecl}
-void splice_after(const_iterator position, forward_list<T,Allocator>&& x);
+void splice_after(const_iterator position, forward_list<T,Alloc@\removedConcepts{ator}@>&& x);
 \end{itemdecl}
 
 \begin{itemdescr}
@@ -2389,7 +2389,7 @@
 \end{itemdescr}
 
 \begin{itemdecl}
-void splice_after(const_iterator position, forward_list<T,Allocator>&& x, const_iterator i);
+void splice_after(const_iterator position, forward_list<T,Alloc@\removedConcepts{ator}@>&& x, const_iterator i);
 \end{itemdecl}
 
 \begin{itemdescr}
@@ -2407,7 +2407,7 @@
 \end{itemdescr}
 
 \begin{itemdecl}
-void splice_after(const_iterator position, forward_list<T,Allocator>&& x, const_iterator first, const_iterator last);
+void splice_after(const_iterator position, forward_list<T,Alloc@\removedConcepts{ator}@>&& x, const_iterator first, const_iterator last);
 \end{itemdecl}
 
 \begin{itemdescr}
@@ -2452,9 +2452,9 @@
 \end{itemdescr}
 
 \begin{itemdecl}
-@\addedConcepts{requires LessThanComparable<T>}@ void merge(forward_list<T,Allocator>&& x);
+@\addedConcepts{requires LessThanComparable<T>}@ void merge(forward_list<T,Alloc@\removedConcepts{ator}@>&& x);
 template <@\changedConcepts{class}{Predicate<auto, T, T>}@ Compare>
- void merge(forward_list<T,Allocator>&& x, Compare comp)
+ void merge(forward_list<T,Alloc@\removedConcepts{ator}@>&& x, Compare comp)
 \end{itemdecl}
 
 \begin{itemdescr}
@@ -2502,12 +2502,12 @@
 \rSec3[forwardlist.spec]{\tcode{forward_list} specialized algorithms}
 
 \begin{itemdecl}
-template <@\changedConcepts{class}{ObjectType}@ T, class Allocator>
- void swap(forward_list<T,Allocator>& x, forward_list<T,Allocator>& y);
-template <@\changedConcepts{class}{ObjectType}@ T, class Allocator>
- void swap(forward_list<T,Allocator>&& x, forward_list<T,Allocator>& y);
-template <@\changedConcepts{class}{ObjectType}@ T, class Allocator>
- void swap(forward_list<T,Allocator>& x, forward_list<T,Allocator>&& y);
+template <@\changedConcepts{class}{ObjectType}@ T, class Alloc@\removedConcepts{ator}@>
+ void swap(forward_list<T,Alloc@\removedConcepts{ator}@>& x, forward_list<T,Alloc@\removedConcepts{ator}@>& y);
+template <@\changedConcepts{class}{ObjectType}@ T, class Alloc@\removedConcepts{ator}@>
+ void swap(forward_list<T,Alloc@\removedConcepts{ator}@>&& x, forward_list<T,Alloc@\removedConcepts{ator}@>& y);
+template <@\changedConcepts{class}{ObjectType}@ T, class Alloc@\removedConcepts{ator}@>
+ void swap(forward_list<T,Alloc@\removedConcepts{ator}@>& x, forward_list<T,Alloc@\removedConcepts{ator}@>&& y);
 \end{itemdecl}
 
 \begin{itemdescr}
@@ -2550,43 +2550,43 @@
 
 \begin{codeblock}
 namespace std {
- template <@\changedConcepts{class}{ObjectType}@ T, class Allocator = allocator<T> >
+ template <@\changedConcepts{class}{ObjectType}@ T, @\changedConcepts{class}{Allocator}@ Alloc@\removedConcepts{ator}@ = allocator<T> >
   @\addedConcepts{requires Destructible<T>}@
   class list {
   public:
     // types:
- typedef typename Allocator::reference reference;
- typedef typename Allocator::const_reference const_reference;
+ typedef typename Alloc@\removedConcepts{ator}@::reference reference;
+ typedef typename Alloc@\removedConcepts{ator}@::const_reference const_reference;
     typedef @\impdef@ iterator; // See \ref{container.requirements}
     typedef @\impdef@ const_iterator; // See \ref{container.requirements}
     typedef @\impdef@ size_type; // See \ref{container.requirements}
     typedef @\impdef@ difference_type;// See \ref{container.requirements}
     typedef T value_type;
- typedef Allocator allocator_type;
- typedef typename Allocator::pointer pointer;
- typedef typename Allocator::const_pointer const_pointer;
+ typedef Alloc@\removedConcepts{ator}@ allocator_type;
+ typedef typename Alloc@\removedConcepts{ator}@::pointer pointer;
+ typedef typename Alloc@\removedConcepts{ator}@::const_pointer const_pointer;
     typedef std::reverse_iterator<iterator> reverse_iterator;
     typedef std::reverse_iterator<const_iterator> const_reverse_iterator;
 
     // \ref{list.cons} construct/copy/destroy:
- explicit list(const Allocator& = Allocator());
+ explicit list(const Alloc@\removedConcepts{ator}@& = Alloc@\removedConcepts{ator}@());
     @\addedConcepts{requires DefaultConstructible<T>}@ explicit list(size_type n);
- @\addedConcepts{requires CopyConstructible<T>}@
- list(size_type @\farg{n}@, const T& @\farg{value}@, const Allocator& = Allocator());
+ @\addedConcepts{requires ConstructibleAsElement<Alloc, T, const T\&>}@
+ list(size_type @\farg{n}@, const T& @\farg{value}@, const Alloc@\removedConcepts{ator}@& = Alloc@\removedConcepts{ator}@());
     template <@\changedConcepts{class InputIterator}{InputIterator Iter}@>
       @\addedConcepts{requires HasConstructor<T, Iter::reference>}@
- list(@\changedConcepts{InputIterator}{Iter}@ @\farg{first}@, @\changedConcepts{InputIterator}{Iter}@ @\farg{last}@, const Allocator& = Allocator());
- @\addedConcepts{requires CopyConstructible<T>}@ list(const list<T,Allocator>& @\farg{x}@);
+ list(@\changedConcepts{InputIterator}{Iter}@ @\farg{first}@, @\changedConcepts{InputIterator}{Iter}@ @\farg{last}@, const Alloc@\removedConcepts{ator}@& = Alloc@\removedConcepts{ator}@());
+ @\addedConcepts{requires ConstructibleAsElement<Alloc, T, const T\&>}@ list(const list<T,Alloc@\removedConcepts{ator}@>& @\farg{x}@);
     list(list&& x);
- @\addedConcepts{requires CopyConstructible<T>}@ list(const list&, const Allocator&);
- list(list&&, const Allocator&);
+ @\addedConcepts{requires ConstructibleAsElement<Alloc, T, const T\&>}@ list(const list&, const Alloc@\removedConcepts{ator}@&);
+ list(list&&, const Alloc@\removedConcepts{ator}@&);
    ~list();
- @\addedConcepts{requires CopyAssignable<T>}@ list<T,Allocator>& operator=(const list<T,Allocator>& @\farg{x}@);
- list<T,Allocator>& operator=(list<T,Allocator>&& x);
+ @\addedConcepts{requires CopyAssignable<T>}@ list<T,Alloc@\removedConcepts{ator}@>& operator=(const list<T,Alloc@\removedConcepts{ator}@>& @\farg{x}@);
+ list<T,Alloc@\removedConcepts{ator}@>& operator=(list<T,Alloc@\removedConcepts{ator}@>&& x);
     template <@\changedConcepts{class InputIterator}{InputIterator Iter}@>
       @\addedConcepts{requires HasCopyAssign<T, Iter::reference> \&\& HasConstructor<T, Iter::reference>}@
       void assign(@\changedConcepts{InputIterator}{Iter}@ first, @\changedConcepts{InputIterator}{Iter}@ last);
- @\addedConcepts{requires CopyAssignable<T> \&\& CopyConstructible<T>}@ void assign(size_type n, const T& t);
+ @\addedConcepts{requires CopyAssignable<T> \&\& ConstructibleAsElement<Alloc, T, const T\&>}@ void assign(size_type n, const T& t);
     allocator_type get_allocator() const;
 
     // iterators:
@@ -2609,7 +2609,7 @@
     size_type size() const;
     size_type max_size() const;
     @\addedConcepts{requires DefaultConstructible<T>}@ void resize(size_type sz);
- @\addedConcepts{requires CopyConstructible<T>}@ void resize(size_type sz, const T& c);
+ @\addedConcepts{requires ConstructibleAsElement<Alloc, T, const T\&>}@ void resize(size_type sz, const T& c);
 
     // element access:
     reference front();
@@ -2630,9 +2630,9 @@
     template <class... Args>
       @\addedConcepts{requires HasConstructor<T, Args\&\&...>}@
       iterator emplace(const_iterator position, Args&&... args);
- @\addedConcepts{requires CopyConstructible<T>}@ iterator insert(const_iterator @\farg{position}@, const T& @\farg{x}@);
- @\addedConcepts{requires MoveConstructible<T>}@ iterator insert(const_iterator position, T&& x);
- @\addedConcepts{requires CopyConstructible<T>}@
+ @\addedConcepts{requires ConstructibleAsElement<Alloc, T, const T\&>}@ iterator insert(const_iterator @\farg{position}@, const T& @\farg{x}@);
+ @\addedConcepts{requires ConstructibleAsElement<Alloc, T, T\&\&>}@ iterator insert(const_iterator position, T&& x);
+ @\addedConcepts{requires ConstructibleAsElement<Alloc, T, const T\&>}@
       void insert(const_iterator @\farg{position}@, size_type @\farg{n}@, const T& @\farg{x}@);
     template <@\changedConcepts{class InputIterator}{InputIterator Iter}@>
       @\addedConcepts{requires HasConstructor<T, Iter::reference>}@
@@ -2641,13 +2641,13 @@
 
     iterator erase(const_iterator @\farg{position}@);
     iterator erase(const_iterator @\farg{position}@, const_iterator @\farg{last}@);
- void swap(list<T,Allocator>&&);
+ void swap(list<T,Alloc@\removedConcepts{ator}@>&&);
     void clear();
 
     // \ref{list.ops} list operations:
- void splice(const_iterator @\farg{position}@, list<T,Allocator>&& @\farg{x}@);
- void splice(const_iterator @\farg{position}@, list<T,Allocator>&& @\farg{x}@, const_iterator @\farg{i}@);
- void splice(const_iterator @\farg{position}@, list<T,Allocator>&& @\farg{x}@,
+ void splice(const_iterator @\farg{position}@, list<T,Alloc@\removedConcepts{ator}@>&& @\farg{x}@);
+ void splice(const_iterator @\farg{position}@, list<T,Alloc@\removedConcepts{ator}@>&& @\farg{x}@, const_iterator @\farg{i}@);
+ void splice(const_iterator @\farg{position}@, list<T,Alloc@\removedConcepts{ator}@>&& @\farg{x}@,
                 const_iterator @\farg{first}@, const_iterator @\farg{last}@);
 
     @\addedConcepts{requires EqualityComparable<T>}@ void remove(const T& @\farg{value}@);
@@ -2657,9 +2657,9 @@
     template <@\changedConcepts{class}{Predicate<auto, T, T>}@ BinaryPredicate>
       void unique(BinaryPredicate @\farg{binary_pred}@);
 
- @\addedConcepts{requires LessThanComparable<T>}@ void merge(list<T,Allocator>&& @\farg{x}@);
+ @\addedConcepts{requires LessThanComparable<T>}@ void merge(list<T,Alloc@\removedConcepts{ator}@>&& @\farg{x}@);
     template <@\changedConcepts{class}{BinaryPredicate<auto, T, T>}@ Compare>
- void merge(list<T,Allocator>&& @\farg{x}@, Compare @\farg{comp}@);
+ void merge(list<T,Alloc@\removedConcepts{ator}@>&& @\farg{x}@, Compare @\farg{comp}@);
 
     @\addedConcepts{requires LessThanComparable<T>}@ void sort();
     template <@\changedConcepts{class}{BinaryPredicate<auto, T, T>}@ Compare> void sort(Compare @\farg{comp}@);
@@ -2667,37 +2667,37 @@
     void reverse();
   };
 
- template <@\changedConcepts{class}{EqualityComparable}@ T, class Allocator>
- bool operator==(const list<T,Allocator>& @\farg{x}@, const list<T,Allocator>& @\farg{y}@);
- template <@\changedConcepts{class}{LessThanComparable}@ T, class Allocator>
- bool operator< (const list<T,Allocator>& @\farg{x}@, const list<T,Allocator>& @\farg{y}@);
- template <@\changedConcepts{class}{EqualityComparable}@ T, class Allocator>
- bool operator!=(const list<T,Allocator>& @\farg{x}@, const list<T,Allocator>& @\farg{y}@);
- template <@\changedConcepts{class}{LessThanComparable}@ T, class Allocator>
- bool operator> (const list<T,Allocator>& @\farg{x}@, const list<T,Allocator>& @\farg{y}@);
- template <@\changedConcepts{class}{LessThanComparable}@ T, class Allocator>
- bool operator>=(const list<T,Allocator>& @\farg{x}@, const list<T,Allocator>& @\farg{y}@);
- template <@\changedConcepts{class}{LessThanComparable}@ T, class Allocator>
- bool operator<=(const list<T,Allocator>& @\farg{x}@, const list<T,Allocator>& @\farg{y}@);
+ template <@\changedConcepts{class}{EqualityComparable}@ T, class Alloc@\removedConcepts{ator}@>
+ bool operator==(const list<T,Alloc@\removedConcepts{ator}@>& @\farg{x}@, const list<T,Alloc@\removedConcepts{ator}@>& @\farg{y}@);
+ template <@\changedConcepts{class}{LessThanComparable}@ T, class Alloc@\removedConcepts{ator}@>
+ bool operator< (const list<T,Alloc@\removedConcepts{ator}@>& @\farg{x}@, const list<T,Alloc@\removedConcepts{ator}@>& @\farg{y}@);
+ template <@\changedConcepts{class}{EqualityComparable}@ T, class Alloc@\removedConcepts{ator}@>
+ bool operator!=(const list<T,Alloc@\removedConcepts{ator}@>& @\farg{x}@, const list<T,Alloc@\removedConcepts{ator}@>& @\farg{y}@);
+ template <@\changedConcepts{class}{LessThanComparable}@ T, class Alloc@\removedConcepts{ator}@>
+ bool operator> (const list<T,Alloc@\removedConcepts{ator}@>& @\farg{x}@, const list<T,Alloc@\removedConcepts{ator}@>& @\farg{y}@);
+ template <@\changedConcepts{class}{LessThanComparable}@ T, class Alloc@\removedConcepts{ator}@>
+ bool operator>=(const list<T,Alloc@\removedConcepts{ator}@>& @\farg{x}@, const list<T,Alloc@\removedConcepts{ator}@>& @\farg{y}@);
+ template <@\changedConcepts{class}{LessThanComparable}@ T, class Alloc@\removedConcepts{ator}@>
+ bool operator<=(const list<T,Alloc@\removedConcepts{ator}@>& @\farg{x}@, const list<T,Alloc@\removedConcepts{ator}@>& @\farg{y}@);
 
   // specialized algorithms:
- template <@\changedConcepts{class}{ObjectType}@ T, class Allocator>
- void swap(list<T,Allocator>& x, list<T,Allocator>& y);
- template <@\changedConcepts{class}{ObjectType}@ T, class Allocator>
- void swap(list<T,Allocator>&& x, list<T,Allocator>& y);
- template <@\changedConcepts{class}{ObjectType}@ T, class Allocator>
- void swap(list<T,Allocator>& x, list<T,Allocator>&& y);
-
- template <class T, class Alloc>
- struct constructible_with_allocator_suffix<list<T, Alloc> >
- : true_type { };
+ template <@\changedConcepts{class}{ObjectType}@ T, class Alloc@\removedConcepts{ator}@>
+ void swap(list<T,Alloc@\removedConcepts{ator}@>& x, list<T,Alloc@\removedConcepts{ator}@>& y);
+ template <@\changedConcepts{class}{ObjectType}@ T, class Alloc@\removedConcepts{ator}@>
+ void swap(list<T,Alloc@\removedConcepts{ator}@>&& x, list<T,Alloc@\removedConcepts{ator}@>& y);
+ template <@\changedConcepts{class}{ObjectType}@ T, class Alloc@\removedConcepts{ator}@>
+ void swap(list<T,Alloc@\removedConcepts{ator}@>& x, list<T,Alloc@\removedConcepts{ator}@>&& y);
+
+ @\removedConcepts{template <class T, class Alloc>}@
+ @\removedConcepts{struct constructible_with_allocator_suffix<list<T, Alloc> >}@
+ @\removedConcepts{: true_type \{ \};}@
 }
 \end{codeblock}
 
 \rSec3[list.cons]{\tcode{list}\ constructors, copy, and assignment}
 
 \begin{itemdecl}
-explicit list(const Allocator& = Allocator());
+explicit list(const Alloc@\removedConcepts{ator}@& = Alloc@\removedConcepts{ator}@());
 \end{itemdecl}
 
 \begin{itemdescr}
@@ -2729,9 +2729,9 @@
 \end{itemdescr}
 
 \begin{itemdecl}
-@\addedConcepts{requires CopyConstructible<T>}@
+@\addedConcepts{requires ConstructibleAsElement<Alloc, T, const T\&>}@
   list(size_type @\farg{n}@, const T& @\farg{value}@,
- const Allocator& = Allocator());
+ const Alloc@\removedConcepts{ator}@& = Alloc@\removedConcepts{ator}@());
 \end{itemdecl}
 
 \begin{itemdescr}
@@ -2757,7 +2757,7 @@
 \begin{itemdecl}
 template <@\changedConcepts{class InputIterator}{InputIterator Iter}@>
   @\addedConcepts{requires HasConstructor<T, Iter::reference>}@
- list(@\changedConcepts{InputIterator}{Iter}@ @\farg{first}@, @\changedConcepts{InputIterator}{Iter}@ @\farg{last}@, const Allocator& = Allocator());
+ list(@\changedConcepts{InputIterator}{Iter}@ @\farg{first}@, @\changedConcepts{InputIterator}{Iter}@ @\farg{last}@, const Alloc@\removedConcepts{ator}@& = Alloc@\removedConcepts{ator}@());
 \end{itemdecl}
 
 \begin{itemdescr}
@@ -2795,7 +2795,7 @@
 \end{itemdescr}
 
 \begin{itemdecl}
-@\addedConcepts{requires CopyAssignable<T> \&\& CopyConstructible<T>}@ void assign(size_type n, const T& t);
+@\addedConcepts{requires CopyAssignable<T> \&\& ConstructibleAsElement<Alloc, T, const T\&>}@ void assign(size_type n, const T& t);
 \end{itemdecl}
 
 \begin{itemdescr}
@@ -2827,7 +2827,7 @@
 
 \index{resize@\tcode{resize}!\tcode{list}}%
 \begin{itemdecl}
-@\addedConcepts{requires CopyConstructible<T>}@ void resize(size_type sz, const T& c);
+@\addedConcepts{requires ConstructibleAsElement<Alloc, T, const T\&>}@ void resize(size_type sz, const T& c);
 \end{itemdecl}
 
 \begin{itemdescr}
@@ -2853,9 +2853,9 @@
 
 \index{insert@\tcode{insert}!\tcode{list}}%
 \begin{itemdecl}
-@\addedConcepts{requires CopyConstructible<T>}@ iterator insert(const_iterator position, const T& x);
-@\addedConcepts{requires MoveConstructible<T>}@ iterator insert(const_iterator position, T&& x);
-@\addedConcepts{requires CopyConstructible<T>}@
+@\addedConcepts{requires ConstructibleAsElement<Alloc, T, const T\&>}@ iterator insert(const_iterator position, const T& x);
+@\addedConcepts{requires ConstructibleAsElement<Alloc, T, T\&\&>}@ iterator insert(const_iterator position, T&& x);
+@\addedConcepts{requires ConstructibleAsElement<Alloc, T, const T\&>}@
   void insert(const_iterator @\farg{position}@, size_type @\farg{n}@, const T& @\farg{x}@);
 template <@\changedConcepts{class InputIterator}{InputIterator Iter}@>
   @\addedConcepts{requires HasConstructor<T, Iter::reference>}@
@@ -2933,7 +2933,7 @@
 
 \index{splice@\tcode{splice}!\tcode{list}}%
 \begin{itemdecl}
-void splice(const_iterator @\farg{position}@, list<T,Allocator>&& @\farg{x}@);
+void splice(const_iterator @\farg{position}@, list<T,Alloc@\removedConcepts{ator}@>&& @\farg{x}@);
 \end{itemdecl}
 
 \begin{itemdescr}
@@ -2970,7 +2970,7 @@
 \end{itemdescr}
 
 \begin{itemdecl}
-void splice(const_iterator @\farg{position}@, list<T,Allocator>&& @\farg{x}@, iterator @\farg{i}@);
+void splice(const_iterator @\farg{position}@, list<T,Alloc@\removedConcepts{ator}@>&& @\farg{x}@, iterator @\farg{i}@);
 \end{itemdecl}
 
 \begin{itemdescr}
@@ -3016,7 +3016,7 @@
 \end{itemdescr}
 
 \begin{itemdecl}
-void splice(const_iterator @\farg{position}@, list<T,Allocator>&& @\farg{x}@, iterator @\farg{first}@,
+void splice(const_iterator @\farg{position}@, list<T,Alloc@\removedConcepts{ator}@>&& @\farg{x}@, iterator @\farg{first}@,
             iterator @\farg{last}@);
 \end{itemdecl}
 
@@ -3137,8 +3137,8 @@
 
 \index{merge@\tcode{merge}!\tcode{list}}%
 \begin{itemdecl}
-@\addedConcepts{requires LessThanComparable<T>}@ void merge(list<T,Allocator>&& @\farg{x}@);
-template <@\changedConcepts{class}{Predicate<auto, T, T>}@ Compare> void merge(list<T,Allocator>&& @\farg{x}@, Compare @\farg{comp}@);
+@\addedConcepts{requires LessThanComparable<T>}@ void merge(list<T,Alloc@\removedConcepts{ator}@>&& @\farg{x}@);
+template <@\changedConcepts{class}{Predicate<auto, T, T>}@ Compare> void merge(list<T,Alloc@\removedConcepts{ator}@>&& @\farg{x}@, Compare @\farg{comp}@);
 \end{itemdecl}
 
 \begin{itemdescr}
@@ -3237,12 +3237,12 @@
 \rSec3[list.special]{\tcode{list}\ specialized algorithms}
 
 \begin{itemdecl}
-template <@\changedConcepts{class}{ObjectType}@ T, class Allocator>
- void swap(list<T,Allocator>& x, list<T,Allocator>& y);
-template <@\changedConcepts{class}{ObjectType}@ T, class Allocator>
- void swap(list<T,Allocator>&& x, list<T,Allocator>& y);
-template <@\changedConcepts{class}{ObjectType}@ T, class Allocator>
- void swap(list<T,Allocator>& x, list<T,Allocator>&& y);
+template <@\changedConcepts{class}{ObjectType}@ T, class Alloc@\removedConcepts{ator}@>
+ void swap(list<T,Alloc@\removedConcepts{ator}@>& x, list<T,Alloc@\removedConcepts{ator}@>& y);
+template <@\changedConcepts{class}{ObjectType}@ T, class Alloc@\removedConcepts{ator}@>
+ void swap(list<T,Alloc@\removedConcepts{ator}@>&& x, list<T,Alloc@\removedConcepts{ator}@>& y);
+template <@\changedConcepts{class}{ObjectType}@ T, class Alloc@\removedConcepts{ator}@>
+ void swap(list<T,Alloc@\removedConcepts{ator}@>& x, list<T,Alloc@\removedConcepts{ator}@>&& y);
 \end{itemdecl}
 
 \begin{itemdescr}
@@ -3471,9 +3471,9 @@
     struct uses_allocator<queue<T, Container>, Alloc>
       : uses_allocator<Container, Alloc>::type { };
 
- template <class T, class Container>
- struct constructible_with_allocator_suffix<queue<T, Container> >
- : true_type { };
+ @\removedConcepts{template <class T, class Container>}@
+ @\removedConcepts{struct constructible_with_allocator_suffix<queue<T, Container> >}@
+ @\removedConcepts{: true_type \{ \};}@
 }
 \end{codeblock}
 
@@ -3665,10 +3665,10 @@
     struct uses_allocator<priority_queue<T, Cont@\removedConcepts{ainer}@, Compare>, Alloc>
       : uses_allocator<Cont@\removedConcepts{ainer}@, Alloc>::type { };
 
- template <class T, class Cont@\removedConcepts{ainer}@, class Compare>
- struct constructible_with_allocator_suffix<
- priority_queue<T, Cont@\removedConcepts{ainer}@, Compare> >
- : true_type { };
+ @\removedConcepts{template <class T, class Container, class Compare>}@
+ @\removedConcepts{struct constructible_with_allocator_suffix<}@
+ @\removedConcepts{priority_queue<T, Container, Compare> >}@
+ @\removedConcepts{: true_type \{ \};}@
 }
 \end{codeblock}
 
@@ -3864,20 +3864,20 @@
     bool operator>=(const stack<T, Cont@\removedConcepts{ainer}@>& x, const stack<T, Cont@\removedConcepts{ainer}@>& y);
   template <@\changedConcepts{class}{LessThanComparable}@ T, class Cont@\removedConcepts{ainer}@>
     bool operator<=(const stack<T, Cont@\removedConcepts{ainer}@>& x, const stack<T, Cont@\removedConcepts{ainer}@>& y);
- template <@\changedConcepts{class}{ObjectType}@ T, class Allocator>
- void swap(stack<T,Allocator>& x, stack<T,Allocator>& y);
- template <@\changedConcepts{class}{ObjectType}@ T, class Allocator>
- void swap(stack<T,Allocator>&& x, stack<T,Allocator>& y);
- template <@\changedConcepts{class}{ObjectType}@ T, class Allocator>
- void swap(stack<T,Allocator>& x, stack<T,Allocator>&& y);
+ template <@\changedConcepts{class}{ObjectType}@ T, class Alloc@\removedConcepts{ator}@>
+ void swap(stack<T,Alloc@\removedConcepts{ator}@>& x, stack<T,Alloc@\removedConcepts{ator}@>& y);
+ template <@\changedConcepts{class}{ObjectType}@ T, class Alloc@\removedConcepts{ator}@>
+ void swap(stack<T,Alloc@\removedConcepts{ator}@>&& x, stack<T,Alloc@\removedConcepts{ator}@>& y);
+ template <@\changedConcepts{class}{ObjectType}@ T, class Alloc@\removedConcepts{ator}@>
+ void swap(stack<T,Alloc@\removedConcepts{ator}@>& x, stack<T,Alloc@\removedConcepts{ator}@>&& y);
 
   template <class T, class Cont@\removedConcepts{ainer}@, class Alloc>
     struct uses_allocator<stack<T, Cont@\removedConcepts{ainer}@>, Alloc>
       : uses_allocator<Cont@\removedConcepts{ainer}@, Alloc>::type { };
 
- template <class T, class Cont@\removedConcepts{ainer}@>
- struct constructible_with_allocator_suffix<stack<T, Cont@\removedConcepts{ainer}@> >
- : true_type { };
+ @\removedConcepts{template <class T, class Container>}@
+ @\removedConcepts{struct constructible_with_allocator_suffix<stack<T, Container> >}@
+ @\removedConcepts{: true_type \{ \};}@
 }
 \end{codeblock}
 
@@ -3992,7 +3992,7 @@
 The elements of a vector are stored contiguously, meaning that if
 \tcode{v}\
 is a
-\tcode{vector<T, Allocator>}\
+\tcode{vector<T, Alloc@\removedConcepts{ator}@>}\
 where
 \tcode{T}\
 is some type other than
@@ -4007,43 +4007,43 @@
 
 \begin{codeblock}
 namespace std {
- template <@\changedConcepts{class}{ObjectType}@ T, class Allocator = allocator<T> >
+ template <@\changedConcepts{class}{ObjectType}@ T, @\changedConcepts{class}{RandomAccessAllocator}@ Alloc@\removedConcepts{ator}@ = allocator<T> >
   @\addedConcepts{requires Destructible<T>}@
   class vector {
   public:
     // types:
- typedef typename Allocator::reference reference;
- typedef typename Allocator::const_reference const_reference;
+ typedef typename Alloc@\removedConcepts{ator}@::reference reference;
+ typedef typename Alloc@\removedConcepts{ator}@::const_reference const_reference;
     typedef @\impdef@ iterator; // See \ref{container.requirements}
     typedef @\impdef@ const_iterator; // See \ref{container.requirements}
     typedef @\impdef@ size_type; // See \ref{container.requirements}
     typedef @\impdef@ difference_type;// See \ref{container.requirements}
     typedef T value_type;
- typedef Allocator allocator_type;
- typedef typename Allocator::pointer pointer;
- typedef typename Allocator::const_pointer const_pointer;
+ typedef Alloc@\removedConcepts{ator}@ allocator_type;
+ typedef typename Alloc@\removedConcepts{ator}@::pointer pointer;
+ typedef typename Alloc@\removedConcepts{ator}@::const_pointer const_pointer;
     typedef std::reverse_iterator<iterator> reverse_iterator;
     typedef std::reverse_iterator<const_iterator> const_reverse_iterator;
 
     // \ref{vector.cons} construct/copy/destroy:
- explicit vector(const Allocator& = Allocator());
+ explicit vector(const Alloc@\removedConcepts{ator}@& = Alloc@\removedConcepts{ator}@());
     @\addedConcepts{requires DefaultConstructible<T>}@ explicit vector(size_type n);
- @\addedConcepts{requires CopyConstructible<T>}@ vector(size_type n, const T& value, const Allocator& = Allocator());
+ @\addedConcepts{requires ConstructibleAsElement<Alloc, T, const T\&>}@ vector(size_type n, const T& value, const Alloc@\removedConcepts{ator}@& = Alloc@\removedConcepts{ator}@());
     template <@\changedConcepts{class InputIterator}{InputIterator Iter}@>
- @\addedConcepts{requires HasConstructor<T, Iter::reference> \&\& MoveConstructible<T>}@
+ @\addedConcepts{requires HasConstructor<T, Iter::reference> \&\& ConstructibleAsElement<Alloc, T, T\&\&>}@
       vector(@\changedConcepts{InputIterator}{Iter}@ first, @\changedConcepts{InputIterator}{Iter}@ last,
- const Allocator& = Allocator());
- @\addedConcepts{requires CopyConstructible<T>}@ vector(const vector<T,Allocator>& x);
+ const Alloc@\removedConcepts{ator}@& = Alloc@\removedConcepts{ator}@());
+ @\addedConcepts{requires ConstructibleAsElement<Alloc, T, const T\&>}@ vector(const vector<T,Alloc@\removedConcepts{ator}@>& x);
     vector(vector&&);
- @\addedConcepts{requires CopyConstructible<T>}@ vector(const vector&, const Allocator&);
- vector(vector&&, const Allocator&);
+ @\addedConcepts{requires ConstructibleAsElement<Alloc, T, const T\&>}@ vector(const vector&, const Alloc@\removedConcepts{ator}@&);
+ vector(vector&&, const Alloc@\removedConcepts{ator}@&);
    ~vector();
- @\addedConcepts{requires CopyAssignable<T>}@ vector<T,Allocator>& operator=(const vector<T,Allocator>& x);
- vector<T,Allocator>& operator=(vector<T,Allocator>&& x);
+ @\addedConcepts{requires CopyAssignable<T>}@ vector<T,Alloc@\removedConcepts{ator}@>& operator=(const vector<T,Alloc@\removedConcepts{ator}@>& x);
+ vector<T,Alloc@\removedConcepts{ator}@>& operator=(vector<T,Alloc@\removedConcepts{ator}@>&& x);
     template <@\changedConcepts{class InputIterator}{InputIterator Iter}@>
       @\addedConcepts{requires HasConstructor<T, Iter::reference> \&\& HasCopyAssign<T, Iter::reference>}@
       void assign(@\changedConcepts{InputIterator}{Iter}@ first, @\changedConcepts{InputIterator}{Iter}@ last);
- @\addedConcepts{requires CopyConstructible<T> \&\& CopyAssignable<T>}@ void assign(size_type n, const T& u);
+ @\addedConcepts{requires ConstructibleAsElement<Alloc, T, const T\&> \&\& CopyAssignable<T>}@ void assign(size_type n, const T& u);
     allocator_type get_allocator() const;
 
     // iterators:
@@ -4064,11 +4064,11 @@
     // \ref{vector.capacity} capacity:
     size_type size() const;
     size_type max_size() const;
- @\addedConcepts{requires DefaultConstructible<T> \&\& MoveConstructible<T>}@ void resize(size_type sz);
- @\addedConcepts{requires CopyConstructible<T>}@ void resize(size_type sz, const T& c);
+ @\addedConcepts{requires DefaultConstructible<T> \&\& ConstructibleAsElement<Alloc, T, T\&\&>}@ void resize(size_type sz);
+ @\addedConcepts{requires ConstructibleAsElement<Alloc, T, const T\&>}@ void resize(size_type sz, const T& c);
     size_type capacity() const;
     bool empty() const;
- @\addedConcepts{requires MoveConstructible<T>}@ void reserve(size_type n);
+ @\addedConcepts{requires ConstructibleAsElement<Alloc, T, T\&\&>}@ void reserve(size_type n);
 
     // element access:
     reference operator[](size_type n);
@@ -4086,54 +4086,54 @@
 
     // \ref{vector.modifiers} modifiers:
     template <class... Args>
- @\addedConcepts{requires HasConstructor<T, Args\&\&...> \&\& MoveConstructible<T>}@
+ @\addedConcepts{requires HasConstructor<T, Args\&\&...> \&\& ConstructibleAsElement<Alloc, T, T\&\&>}@
       void push_back(Args&&... args);
     void pop_back();
 
     template <class... Args>
- @\addedConcepts{requires HasConstructor<T, Args\&\&...> \&\& MoveConstructible<T>}@
+ @\addedConcepts{requires HasConstructor<T, Args\&\&...> \&\& ConstructibleAsElement<Alloc, T, T\&\&>}@
       iterator emplace(const_iterator position, Args&&... args);
- @\addedConcepts{requires CopyConstructible<T> \&\& CopyAssignable<T>}@
+ @\addedConcepts{requires ConstructibleAsElement<Alloc, T, const T\&> \&\& CopyAssignable<T>}@
       iterator insert(const_iterator position, const T& x);
- @\addedConcepts{requires MoveConstructible<T> \&\& MoveAssignable<T>}@
+ @\addedConcepts{requires ConstructibleAsElement<Alloc, T, T\&\&> \&\& MoveAssignable<T>}@
       void insert(const_iterator position, T&& x);
- @\addedConcepts{requires CopyConstructible<T> \&\& CopyAssignable<T>}@
+ @\addedConcepts{requires ConstructibleAsElement<Alloc, T, const T\&> \&\& CopyAssignable<T>}@
       void insert(const_iterator position, size_type n, const T& x);
     template <@\changedConcepts{class InputIterator}{InputIterator Iter}@>
         @\addedConcepts{requires HasConstructor<T, Iter::reference> \&\& HasCopyAssign<T, Iter::reference>}@
- @\addedConcepts{\&\& MoveConstructible<T> \&\& MoveAssignable<T>}@
+ @\addedConcepts{\&\& ConstructibleAsElement<Alloc, T, T\&\&> \&\& MoveAssignable<T>}@
         void insert(const_iterator position,
                     @\changedConcepts{InputIterator}{Iter}@ first, @\changedConcepts{InputIterator}{Iter}@ last);
     @\addedConcepts{requires MoveAssignable<T>}@ iterator erase(const_iterator position);
     @\addedConcepts{requires MoveAssignable<T>}@ iterator erase(const_iterator first, const_iterator last);
- void swap(vector<T,Allocator>&&);
+ void swap(vector<T,Alloc@\removedConcepts{ator}@>&&);
     void clear();
   };
 
- template <@\changedConcepts{class}{EqualityComparable}@ T, class Allocator>
- bool operator==(const vector<T,Allocator>& x, const vector<T,Allocator>& y);
- template <@\changedConcepts{class}{LessThanComparable}@ T, class Allocator>
- bool operator< (const vector<T,Allocator>& x, const vector<T,Allocator>& y);
- template <@\changedConcepts{class}{EqualityComparable}@ T, class Allocator>
- bool operator!=(const vector<T,Allocator>& x, const vector<T,Allocator>& y);
- template <@\changedConcepts{class}{LessThanComparable}@ T, class Allocator>
- bool operator> (const vector<T,Allocator>& x, const vector<T,Allocator>& y);
- template <@\changedConcepts{class}{LessThanComparable}@ T, class Allocator>
- bool operator>=(const vector<T,Allocator>& x, const vector<T,Allocator>& y);
- template <@\changedConcepts{class}{LessThanComparable}@ T, class Allocator>
- bool operator<=(const vector<T,Allocator>& x, const vector<T,Allocator>& y);
+ template <@\changedConcepts{class}{EqualityComparable}@ T, class Alloc@\removedConcepts{ator}@>
+ bool operator==(const vector<T,Alloc@\removedConcepts{ator}@>& x, const vector<T,Alloc@\removedConcepts{ator}@>& y);
+ template <@\changedConcepts{class}{LessThanComparable}@ T, class Alloc@\removedConcepts{ator}@>
+ bool operator< (const vector<T,Alloc@\removedConcepts{ator}@>& x, const vector<T,Alloc@\removedConcepts{ator}@>& y);
+ template <@\changedConcepts{class}{EqualityComparable}@ T, class Alloc@\removedConcepts{ator}@>
+ bool operator!=(const vector<T,Alloc@\removedConcepts{ator}@>& x, const vector<T,Alloc@\removedConcepts{ator}@>& y);
+ template <@\changedConcepts{class}{LessThanComparable}@ T, class Alloc@\removedConcepts{ator}@>
+ bool operator> (const vector<T,Alloc@\removedConcepts{ator}@>& x, const vector<T,Alloc@\removedConcepts{ator}@>& y);
+ template <@\changedConcepts{class}{LessThanComparable}@ T, class Alloc@\removedConcepts{ator}@>
+ bool operator>=(const vector<T,Alloc@\removedConcepts{ator}@>& x, const vector<T,Alloc@\removedConcepts{ator}@>& y);
+ template <@\changedConcepts{class}{LessThanComparable}@ T, class Alloc@\removedConcepts{ator}@>
+ bool operator<=(const vector<T,Alloc@\removedConcepts{ator}@>& x, const vector<T,Alloc@\removedConcepts{ator}@>& y);
 
   // specialized algorithms:
- template <@\changedConcepts{class}{ObjectType}@ T, class Allocator>
- void swap(vector<T,Allocator>& x, vector<T,Allocator>& y);
- template <@\changedConcepts{class}{ObjectType}@ T, class Allocator>
- void swap(vector<T,Allocator>&& x, vector<T,Allocator>& y);
- template <@\changedConcepts{class}{ObjectType}@ T, class Allocator>
- void swap(vector<T,Allocator>& x, vector<T,Allocator>&& y);
-
- template <class T, class Alloc>
- struct constructible_with_allocator_suffix<vector<T, Alloc> >
- : true_type { };
+ template <@\changedConcepts{class}{ObjectType}@ T, class Alloc@\removedConcepts{ator}@>
+ void swap(vector<T,Alloc@\removedConcepts{ator}@>& x, vector<T,Alloc@\removedConcepts{ator}@>& y);
+ template <@\changedConcepts{class}{ObjectType}@ T, class Alloc@\removedConcepts{ator}@>
+ void swap(vector<T,Alloc@\removedConcepts{ator}@>&& x, vector<T,Alloc@\removedConcepts{ator}@>& y);
+ template <@\changedConcepts{class}{ObjectType}@ T, class Alloc@\removedConcepts{ator}@>
+ void swap(vector<T,Alloc@\removedConcepts{ator}@>& x, vector<T,Alloc@\removedConcepts{ator}@>&& y);
+
+ @\removedConcepts{template <class T, class Alloc>}@
+ @\removedConcepts{struct constructible_with_allocator_suffix<vector<T, Alloc> >}@
+ @\removedConcepts{: true_type \{ \};}@
 }
 \end{codeblock}%
 \index{vector@\tcode{vector}!\tcode{operator==}}%
@@ -4143,7 +4143,7 @@
 
 \index{vector@\tcode{vector}!\tcode{vector}}
 \begin{itemdecl}
-vector(const Allocator& = Allocator());
+vector(const Alloc@\removedConcepts{ator}@& = Alloc@\removedConcepts{ator}@());
 \end{itemdecl}
 
 \begin{itemdescr}
@@ -4174,9 +4174,9 @@
 
 \index{vector@\tcode{vector}!\tcode{vector}}
 \begin{itemdecl}
-@\addedConcepts{requires CopyConstructible<T>}@
+@\addedConcepts{requires ConstructibleAsElement<Alloc, T, const T\&>}@
 explicit vector(size_type n, const T& value,
- const Allocator& = Allocator());
+ const Alloc@\removedConcepts{ator}@& = Alloc@\removedConcepts{ator}@());
 \end{itemdecl}
 
 \begin{itemdescr}
@@ -4194,9 +4194,9 @@
 \index{vector@\tcode{vector}!\tcode{vector}}
 \begin{itemdecl}
 template <@\changedConcepts{class InputIterator}{InputIterator Iter}@>
- @\addedConcepts{requires HasConstructor<T, Iter::reference> \&\& MoveConstructible<T>}@
+ @\addedConcepts{requires HasConstructor<T, Iter::reference> \&\& ConstructibleAsElement<Alloc, T, T\&\&>}@
   vector(@\changedConcepts{InputIterator}{Iter}@ first, @\changedConcepts{InputIterator}{Iter}@ last,
- const Allocator& = Allocator());
+ const Alloc@\removedConcepts{ator}@& = Alloc@\removedConcepts{ator}@());
 \end{itemdecl}
 
 \begin{itemdescr}
@@ -4242,7 +4242,7 @@
 \end{itemdescr}
 
 \begin{itemdecl}
-@\addedConcepts{requires CopyConstructible<T> \&\& CopyAssignable<T>}@
+@\addedConcepts{requires ConstructibleAsElement<Alloc, T, const T\&> \&\& CopyAssignable<T>}@
   void assign(size_type n, const T& t);
 \end{itemdecl}
 
@@ -4271,7 +4271,7 @@
 
 \index{reserve@\tcode{reserve}!\tcode{vector}}%
 \begin{itemdecl}
-@\addedConcepts{requires MoveConstructible<T>}@ void reserve(size_type n);
+@\addedConcepts{requires ConstructibleAsElement<Alloc, T, T\&\&>}@ void reserve(size_type n);
 \end{itemdecl}
 
 \pnum
@@ -4309,7 +4309,7 @@
 \footnote{
 \tcode{reserve()}\
 uses
-\tcode{Allocator::allocate()}\
+\tcode{Alloc@\removedConcepts{ator}@::allocate()}\
 which may throw an appropriate exception.
 }
 
@@ -4327,7 +4327,7 @@
 
 \index{swap@\tcode{swap}!\tcode{vector}}%
 \begin{itemdecl}
-void swap(vector<T,Allocator>&& x);
+void swap(vector<T,Alloc@\removedConcepts{ator}@>&& x);
 \end{itemdecl}
 
 \begin{itemdescr}
@@ -4346,7 +4346,7 @@
 
 \index{resize@\tcode{resize}!\tcode{vector}}%
 \begin{itemdecl}
-@\addedConcepts{requires DefaultConstructible<T> \&\& MoveConstructible<T>}@ void resize(size_type sz);
+@\addedConcepts{requires DefaultConstructible<T> \&\& ConstructibleAsElement<Alloc, T, T\&\&>}@ void resize(size_type sz);
 \end{itemdecl}
 
 \begin{itemdescr}
@@ -4363,7 +4363,7 @@
 
 \index{resize@\tcode{resize}!\tcode{vector}}%
 \begin{itemdecl}
-@\addedConcepts{requires CopyConstructible<T>}@ void resize(size_type sz, const T& c);
+@\addedConcepts{requires ConstructibleAsElement<Alloc, T, const T\&>}@ void resize(size_type sz, const T& c);
 \end{itemdecl}
 
 \begin{itemdescr}
@@ -4409,23 +4409,23 @@
 
 \index{insert@\tcode{insert}!\tcode{vector}}%
 \begin{itemdecl}
-@\addedConcepts{requires CopyConstructible<T> \&\& CopyAssignable<T>}@
+@\addedConcepts{requires ConstructibleAsElement<Alloc, T, const T\&> \&\& CopyAssignable<T>}@
   iterator insert(const_iterator position, const T& x);
-@\addedConcepts{requires MoveConstructible<T> \&\& MoveAssignable<T>}@
+@\addedConcepts{requires ConstructibleAsElement<Alloc, T, T\&\&> \&\& MoveAssignable<T>}@
   iterator insert(const_iterator position, T&& x);
-@\addedConcepts{requires CopyConstructible<T> \&\& CopyAssignable<T>}@
+@\addedConcepts{requires ConstructibleAsElement<Alloc, T, const T\&> \&\& CopyAssignable<T>}@
   void insert(const_iterator position, size_type n, const T& x);
 template <@\changedConcepts{class InputIterator}{InputIterator Iter}@>
     @\addedConcepts{requires HasConstructor<T, Iter::reference> \&\& HasCopyAssign<T, Iter::reference>}@
- @\addedConcepts{\&\& MoveConstructible<T> \&\& MoveAssignable<T>}@
+ @\addedConcepts{\&\& ConstructibleAsElement<Alloc, T, T\&\&> \&\& MoveAssignable<T>}@
     void insert(const_iterator position,
                 @\changedConcepts{InputIterator}{Iter}@ first, @\changedConcepts{InputIterator}{Iter}@ last);
 
 template <class... Args>
- @\addedConcepts{requires HasConstructor<T, Args\&\&...> \&\& MoveConstructible<T>}@
+ @\addedConcepts{requires HasConstructor<T, Args\&\&...> \&\& ConstructibleAsElement<Alloc, T, T\&\&>}@
   void push_back(Args&&... args);
 template <class... Args>
- @\addedConcepts{requires HasConstructor<T, Args\&\&...> \&\& MoveConstructible<T>}@
+ @\addedConcepts{requires HasConstructor<T, Args\&\&...> \&\& ConstructibleAsElement<Alloc, T, T\&\&>}@
   iterator emplace(const_iterator position, Args&&... args);
 \end{itemdecl}
 
@@ -4477,12 +4477,12 @@
 \rSec3[vector.special]{\tcode{vector}\ specialized algorithms}
 
 \begin{itemdecl}
-template <@\changedConcepts{class}{ObjectType}@ T, class Allocator>
- void swap(vector<T,Allocator>& x, vector<T,Allocator>& y);
-template <@\changedConcepts{class}{ObjectType}@ T, class Allocator>
- void swap(vector<T,Allocator>&& x, vector<T,Allocator>& y);
-template <@\changedConcepts{class}{ObjectType}@ T, class Allocator>
- void swap(vector<T,Allocator>& x, vector<T,Allocator>&& y);
+template <@\changedConcepts{class}{ObjectType}@ T, class Alloc@\removedConcepts{ator}@>
+ void swap(vector<T,Alloc@\removedConcepts{ator}@>& x, vector<T,Alloc@\removedConcepts{ator}@>& y);
+template <@\changedConcepts{class}{ObjectType}@ T, class Alloc@\removedConcepts{ator}@>
+ void swap(vector<T,Alloc@\removedConcepts{ator}@>&& x, vector<T,Alloc@\removedConcepts{ator}@>& y);
+template <@\changedConcepts{class}{ObjectType}@ T, class Alloc@\removedConcepts{ator}@>
+ void swap(vector<T,Alloc@\removedConcepts{ator}@>& x, vector<T,Alloc@\removedConcepts{ator}@>&& y);
 \end{itemdecl}
 
 \begin{itemdescr}
@@ -4503,7 +4503,7 @@
 
 \begin{codeblock}
 namespace std {
- template <class Allocator> class vector<bool, Allocator> {
+ template <@\changedConcepts{class}{RandomAccessAllocator}@ Alloc@\removedConcepts{ator}@> class vector<bool, Alloc@\removedConcepts{ator}@> {
   public:
     // types:
     typedef bool const_reference;
@@ -4512,7 +4512,7 @@
     typedef @\impdef@ size_type; // See \ref{container.requirements}
     typedef @\impdef@ difference_type;// See \ref{container.requirements}
     typedef bool value_type;
- typedef Allocator allocator_type;
+ typedef Alloc@\removedConcepts{ator}@ allocator_type;
     typedef @\impdef@ pointer;
     typedef @\impdef@ const_pointer;
     typedef std::reverse_iterator<iterator> reverse_iterator;
@@ -4531,20 +4531,20 @@
     };
 
     // construct/copy/destroy:
- explicit vector(const Allocator& = Allocator());
+ explicit vector(const Alloc@\removedConcepts{ator}@& = Alloc@\removedConcepts{ator}@());
     explicit vector(size_type n, const bool& value = bool(),
- const Allocator& = Allocator());
+ const Alloc@\removedConcepts{ator}@& = Alloc@\removedConcepts{ator}@());
     template <@\changedConcepts{class InputIterator}{InputIterator Iter}@>
       @\addedConcepts{requires Convertible<Iter::reference, bool>}@
       vector(@\changedConcepts{InputIterator}{Iter}@ first, @\changedConcepts{InputIterator}{Iter}@ last,
- const Allocator& = Allocator());
- vector(const vector<bool,Allocator>& x);
- vector(vector<bool,Allocator>&& x);
- vector(const vector&, const Allocator&);
- vector(vector&&, const Allocator&);
+ const Alloc@\removedConcepts{ator}@& = Alloc@\removedConcepts{ator}@());
+ vector(const vector<bool,Alloc@\removedConcepts{ator}@>& x);
+ vector(vector<bool,Alloc@\removedConcepts{ator}@>&& x);
+ vector(const vector&, const Alloc@\removedConcepts{ator}@&);
+ vector(vector&&, const Alloc@\removedConcepts{ator}@&);
    ~vector();
- vector<bool,Allocator>& operator=(const vector<bool,Allocator>& x);
- vector<bool,Allocator>& operator=(vector<bool,Allocator>&& x);
+ vector<bool,Alloc@\removedConcepts{ator}@>& operator=(const vector<bool,Alloc@\removedConcepts{ator}@>& x);
+ vector<bool,Alloc@\removedConcepts{ator}@>& operator=(vector<bool,Alloc@\removedConcepts{ator}@>&& x);
     template <@\changedConcepts{class InputIterator}{InputIterator Iter}@>
       @\addedConcepts{requires Convertible<Iter::reference, bool>}@
       void assign(@\changedConcepts{InputIterator}{Iter}@ first, @\changedConcepts{InputIterator}{Iter}@ last);
@@ -4596,7 +4596,7 @@
 
     iterator erase(const_iterator position);
     iterator erase(const_iterator first, const_iterator last);
- void swap(vector<bool,Allocator>&&);
+ void swap(vector<bool,Alloc@\removedConcepts{ator}@>&&);
     static void swap(reference x, reference y);
     void flip(); // flips all bits
     void clear();
@@ -4646,69 +4646,73 @@
 namespace std {
   template <@\changedConcepts{class}{ObjectType}@ Key, @\changedConcepts{class}{ObjectType}@ T,
             @\changedConcepts{class}{Predicate<auto, Key, Key>}@ Compare = less<Key>,
- class Allocator = allocator<pair<const Key, T> > >
+ @\changedConcepts{class}{Allocator}@ Alloc@\removedConcepts{ator}@ = allocator<pair<const Key, T> > >
     @\addedConcepts{requires Destructible<Key> \&\& Destructible<T> \&\& CopyConstructible<Compare>}@
+ @\addedConcepts{\&\& ConstructibleAsElement<Alloc, Compare, const Compare\&>}@
+ @\addedConcepts{\&\& ConstructibleAsElement<Alloc, Compare, Compare\&\&>}@
     class map;
- template <@\changedConcepts{class}{EqualityComparable}@ Key, @\changedConcepts{class}{EqualityComparable}@ T, class Compare, class Allocator>
- bool operator==(const map<Key,T,Compare,Allocator>& x,
- const map<Key,T,Compare,Allocator>& y);
- template <@\changedConcepts{class}{LessThanComparable}@ Key, @\changedConcepts{class}{LessThanComparable}@ T, class Compare, class Allocator>
- bool operator< (const map<Key,T,Compare,Allocator>& x,
- const map<Key,T,Compare,Allocator>& y);
- template <@\changedConcepts{class}{EqualityComparable}@ Key, @\changedConcepts{class}{EqualityComparable}@ T, class Compare, class Allocator>
- bool operator!=(const map<Key,T,Compare,Allocator>& x,
- const map<Key,T,Compare,Allocator>& y);
- template <@\changedConcepts{class}{LessThanComparable}@ Key, @\changedConcepts{class}{LessThanComparable}@ T, class Compare, class Allocator>
- bool operator> (const map<Key,T,Compare,Allocator>& x,
- const map<Key,T,Compare,Allocator>& y);
- template <@\changedConcepts{class}{LessThanComparable}@ Key, @\changedConcepts{class}{LessThanComparable}@ T, class Compare, class Allocator>
- bool operator>=(const map<Key,T,Compare,Allocator>& x,
- const map<Key,T,Compare,Allocator>& y);
- template <@\changedConcepts{class}{LessThanComparable}@ Key, @\changedConcepts{class}{LessThanComparable}@ T, class Compare, class Allocator>
- bool operator<=(const map<Key,T,Compare,Allocator>& x,
- const map<Key,T,Compare,Allocator>& y);
- template <@\changedConcepts{class}{ObjectType}@ Key, @\changedConcepts{class}{ObjectType}@ T, class Compare, class Allocator>
- void swap(map<Key,T,Compare,Allocator>& x,
- map<Key,T,Compare,Allocator>& y);
- template <@\changedConcepts{class}{ObjectType}@ Key, @\changedConcepts{class}{ObjectType}@ T, class Compare, class Allocator>
- void swap(map<Key,T,Compare,Allocator&& x,
- map<Key,T,Compare,Allocator>& y);
- template <@\changedConcepts{class}{ObjectType}@ Key, @\changedConcepts{class}{ObjectType}@ T, class Compare, class Allocator>
- void swap(map<Key,T,Compare,Allocator& x,
- map<Key,T,Compare,Allocator>&& y);
+ template <@\changedConcepts{class}{EqualityComparable}@ Key, @\changedConcepts{class}{EqualityComparable}@ T, class Compare, class Alloc@\removedConcepts{ator}@>
+ bool operator==(const map<Key,T,Compare,Alloc@\removedConcepts{ator}@>& x,
+ const map<Key,T,Compare,Alloc@\removedConcepts{ator}@>& y);
+ template <@\changedConcepts{class}{LessThanComparable}@ Key, @\changedConcepts{class}{LessThanComparable}@ T, class Compare, class Alloc@\removedConcepts{ator}@>
+ bool operator< (const map<Key,T,Compare,Alloc@\removedConcepts{ator}@>& x,
+ const map<Key,T,Compare,Alloc@\removedConcepts{ator}@>& y);
+ template <@\changedConcepts{class}{EqualityComparable}@ Key, @\changedConcepts{class}{EqualityComparable}@ T, class Compare, class Alloc@\removedConcepts{ator}@>
+ bool operator!=(const map<Key,T,Compare,Alloc@\removedConcepts{ator}@>& x,
+ const map<Key,T,Compare,Alloc@\removedConcepts{ator}@>& y);
+ template <@\changedConcepts{class}{LessThanComparable}@ Key, @\changedConcepts{class}{LessThanComparable}@ T, class Compare, class Alloc@\removedConcepts{ator}@>
+ bool operator> (const map<Key,T,Compare,Alloc@\removedConcepts{ator}@>& x,
+ const map<Key,T,Compare,Alloc@\removedConcepts{ator}@>& y);
+ template <@\changedConcepts{class}{LessThanComparable}@ Key, @\changedConcepts{class}{LessThanComparable}@ T, class Compare, class Alloc@\removedConcepts{ator}@>
+ bool operator>=(const map<Key,T,Compare,Alloc@\removedConcepts{ator}@>& x,
+ const map<Key,T,Compare,Alloc@\removedConcepts{ator}@>& y);
+ template <@\changedConcepts{class}{LessThanComparable}@ Key, @\changedConcepts{class}{LessThanComparable}@ T, class Compare, class Alloc@\removedConcepts{ator}@>
+ bool operator<=(const map<Key,T,Compare,Alloc@\removedConcepts{ator}@>& x,
+ const map<Key,T,Compare,Alloc@\removedConcepts{ator}@>& y);
+ template <@\changedConcepts{class}{ObjectType}@ Key, @\changedConcepts{class}{ObjectType}@ T, class Compare, class Alloc@\removedConcepts{ator}@>
+ void swap(map<Key,T,Compare,Alloc@\removedConcepts{ator}@>& x,
+ map<Key,T,Compare,Alloc@\removedConcepts{ator}@>& y);
+ template <@\changedConcepts{class}{ObjectType}@ Key, @\changedConcepts{class}{ObjectType}@ T, class Compare, class Alloc@\removedConcepts{ator}@>
+ void swap(map<Key,T,Compare,Alloc@\removedConcepts{ator}@&& x,
+ map<Key,T,Compare,Alloc@\removedConcepts{ator}@>& y);
+ template <@\changedConcepts{class}{ObjectType}@ Key, @\changedConcepts{class}{ObjectType}@ T, class Compare, class Alloc@\removedConcepts{ator}@>
+ void swap(map<Key,T,Compare,Alloc@\removedConcepts{ator}@& x,
+ map<Key,T,Compare,Alloc@\removedConcepts{ator}@>&& y);
 
   template <@\changedConcepts{class}{ObjectType}@ Key, @\changedConcepts{class}{ObjectType}@ T,
             @\changedConcepts{class}{Predicate<auto, Key, Key>}@ Compare = less<Key>,
- class Allocator = allocator<pair<const Key, T> > >
+ @\changedConcepts{class}{Allocator}@ Alloc@\removedConcepts{ator}@ = allocator<pair<const Key, T> > >
     @\addedConcepts{requires Destructible<Key> \&\& Destructible<T> \&\& CopyConstructible<Compare>}@
+ @\addedConcepts{\&\& ConstructibleAsElement<Alloc, Compare, const Compare\&>}@
+ @\addedConcepts{\&\& ConstructibleAsElement<Alloc, Compare, Compare\&\&>}@
     class multimap;
- template <@\changedConcepts{class}{EqualityComparable}@ Key, @\changedConcepts{class}{EqualityComparable}@ T, class Compare, class Allocator>
- bool operator==(const multimap<Key,T,Compare,Allocator>& x,
- const multimap<Key,T,Compare,Allocator>& y);
- template <@\changedConcepts{class}{LessThanComparable}@ Key, @\changedConcepts{class}{LessThanComparable}@ T, class Compare, class Allocator>
- bool operator< (const multimap<Key,T,Compare,Allocator>& x,
- const multimap<Key,T,Compare,Allocator>& y);
- template <@\changedConcepts{class}{EqualityComparable}@ Key, @\changedConcepts{class}{EqualityComparable}@ T, class Compare, class Allocator>
- bool operator!=(const multimap<Key,T,Compare,Allocator>& x,
- const multimap<Key,T,Compare,Allocator>& y);
- template <@\changedConcepts{class}{LessThanComparable}@ Key, @\changedConcepts{class}{LessThanComparable}@ T, class Compare, class Allocator>
- bool operator> (const multimap<Key,T,Compare,Allocator>& x,
- const multimap<Key,T,Compare,Allocator>& y);
- template <@\changedConcepts{class}{LessThanComparable}@ Key, @\changedConcepts{class}{LessThanComparable}@ T, class Compare, class Allocator>
- bool operator>=(const multimap<Key,T,Compare,Allocator>& x,
- const multimap<Key,T,Compare,Allocator>& y);
- template <@\changedConcepts{class}{LessThanComparable}@ Key, @\changedConcepts{class}{LessThanComparable}@ T, class Compare, class Allocator>
- bool operator<=(const multimap<Key,T,Compare,Allocator>& x,
- const multimap<Key,T,Compare,Allocator>& y);
- template <@\changedConcepts{class}{ObjectType}@ Key, @\changedConcepts{class}{ObjectType}@ T, class Compare, class Allocator>
- void swap(multimap<Key,T,Compare,Allocator>& x,
- multimap<Key,T,Compare,Allocator>& y);
- template <@\changedConcepts{class}{ObjectType}@ Key, @\changedConcepts{class}{ObjectType}@ T, class Compare, class Allocator>
- void swap(multimap<Key,T,Compare,Allocator&& x,
- multimap<Key,T,Compare,Allocator>& y);
- template <@\changedConcepts{class}{ObjectType}@ Key, @\changedConcepts{class}{ObjectType}@ T, class Compare, class Allocator>
- void swap(multimap<Key,T,Compare,Allocator& x,
- multimap<Key,T,Compare,Allocator>&& y);
+ template <@\changedConcepts{class}{EqualityComparable}@ Key, @\changedConcepts{class}{EqualityComparable}@ T, class Compare, class Alloc@\removedConcepts{ator}@>
+ bool operator==(const multimap<Key,T,Compare,Alloc@\removedConcepts{ator}@>& x,
+ const multimap<Key,T,Compare,Alloc@\removedConcepts{ator}@>& y);
+ template <@\changedConcepts{class}{LessThanComparable}@ Key, @\changedConcepts{class}{LessThanComparable}@ T, class Compare, class Alloc@\removedConcepts{ator}@>
+ bool operator< (const multimap<Key,T,Compare,Alloc@\removedConcepts{ator}@>& x,
+ const multimap<Key,T,Compare,Alloc@\removedConcepts{ator}@>& y);
+ template <@\changedConcepts{class}{EqualityComparable}@ Key, @\changedConcepts{class}{EqualityComparable}@ T, class Compare, class Alloc@\removedConcepts{ator}@>
+ bool operator!=(const multimap<Key,T,Compare,Alloc@\removedConcepts{ator}@>& x,
+ const multimap<Key,T,Compare,Alloc@\removedConcepts{ator}@>& y);
+ template <@\changedConcepts{class}{LessThanComparable}@ Key, @\changedConcepts{class}{LessThanComparable}@ T, class Compare, class Alloc@\removedConcepts{ator}@>
+ bool operator> (const multimap<Key,T,Compare,Alloc@\removedConcepts{ator}@>& x,
+ const multimap<Key,T,Compare,Alloc@\removedConcepts{ator}@>& y);
+ template <@\changedConcepts{class}{LessThanComparable}@ Key, @\changedConcepts{class}{LessThanComparable}@ T, class Compare, class Alloc@\removedConcepts{ator}@>
+ bool operator>=(const multimap<Key,T,Compare,Alloc@\removedConcepts{ator}@>& x,
+ const multimap<Key,T,Compare,Alloc@\removedConcepts{ator}@>& y);
+ template <@\changedConcepts{class}{LessThanComparable}@ Key, @\changedConcepts{class}{LessThanComparable}@ T, class Compare, class Alloc@\removedConcepts{ator}@>
+ bool operator<=(const multimap<Key,T,Compare,Alloc@\removedConcepts{ator}@>& x,
+ const multimap<Key,T,Compare,Alloc@\removedConcepts{ator}@>& y);
+ template <@\changedConcepts{class}{ObjectType}@ Key, @\changedConcepts{class}{ObjectType}@ T, class Compare, class Alloc@\removedConcepts{ator}@>
+ void swap(multimap<Key,T,Compare,Alloc@\removedConcepts{ator}@>& x,
+ multimap<Key,T,Compare,Alloc@\removedConcepts{ator}@>& y);
+ template <@\changedConcepts{class}{ObjectType}@ Key, @\changedConcepts{class}{ObjectType}@ T, class Compare, class Alloc@\removedConcepts{ator}@>
+ void swap(multimap<Key,T,Compare,Alloc@\removedConcepts{ator}@&& x,
+ multimap<Key,T,Compare,Alloc@\removedConcepts{ator}@>& y);
+ template <@\changedConcepts{class}{ObjectType}@ Key, @\changedConcepts{class}{ObjectType}@ T, class Compare, class Alloc@\removedConcepts{ator}@>
+ void swap(multimap<Key,T,Compare,Alloc@\removedConcepts{ator}@& x,
+ multimap<Key,T,Compare,Alloc@\removedConcepts{ator}@>&& y);
 }
 \end{codeblock}
 
@@ -4718,68 +4722,72 @@
 \begin{codeblock}
 namespace std {
   template <@\changedConcepts{class}{ObjectType}@ Key, @\changedConcepts{class}{Predicate<auto, Key, Key>}@ Compare = less<Key>,
- class Allocator = allocator<Key> >
+ @\changedConcepts{class}{Allocator}@ Alloc@\removedConcepts{ator}@ = allocator<Key> >
     @\addedConcepts{requires Destructible<Key> \&\& CopyConstructible<Compare>}@
+ @\addedConcepts{\&\& ConstructibleAsElement<Alloc, Compare, const Compare\&>}@
+ @\addedConcepts{\&\& ConstructibleAsElement<Alloc, Compare, Compare\&\&>}@
     class set;
- template <@\changedConcepts{class}{EqualityComparable}@ Key, class Compare, class Allocator>
- bool operator==(const set<Key,Compare,Allocator>& x,
- const set<Key,Compare,Allocator>& y);
- template <@\changedConcepts{class}{LessThanComparable}@ Key, class Compare, class Allocator>
- bool operator< (const set<Key,Compare,Allocator>& x,
- const set<Key,Compare,Allocator>& y);
- template <@\changedConcepts{class}{EqualityComparable}@ Key, class Compare, class Allocator>
- bool operator!=(const set<Key,Compare,Allocator>& x,
- const set<Key,Compare,Allocator>& y);
- template <@\changedConcepts{class}{LessThanComparable}@ Key, class Compare, class Allocator>
- bool operator> (const set<Key,Compare,Allocator>& x,
- const set<Key,Compare,Allocator>& y);
- template <@\changedConcepts{class}{LessThanComparable}@ Key, class Compare, class Allocator>
- bool operator>=(const set<Key,Compare,Allocator>& x,
- const set<Key,Compare,Allocator>& y);
- template <@\changedConcepts{class}{LessThanComparable}@ Key, class Compare, class Allocator>
- bool operator<=(const set<Key,Compare,Allocator>& x,
- const set<Key,Compare,Allocator>& y);
- template <@\changedConcepts{class}{ObjectType}@ Key, class Compare, class Allocator>
- void swap(set<Key,Compare,Allocator>& x,
- set<Key,Compare,Allocator>& y);
- template <@\changedConcepts{class}{ObjectType}@ Key, class T, class Compare, class Allocator>
- void swap(set<Key,T,Compare,Allocator&& x,
- set<Key,T,Compare,Allocator>& y);
- template <@\changedConcepts{class}{ObjectType}@ Key, class T, class Compare, class Allocator>
- void swap(set<Key,T,Compare,Allocator& x,
- set<Key,T,Compare,Allocator>&& y);
+ template <@\changedConcepts{class}{EqualityComparable}@ Key, class Compare, class Alloc@\removedConcepts{ator}@>
+ bool operator==(const set<Key,Compare,Alloc@\removedConcepts{ator}@>& x,
+ const set<Key,Compare,Alloc@\removedConcepts{ator}@>& y);
+ template <@\changedConcepts{class}{LessThanComparable}@ Key, class Compare, class Alloc@\removedConcepts{ator}@>
+ bool operator< (const set<Key,Compare,Alloc@\removedConcepts{ator}@>& x,
+ const set<Key,Compare,Alloc@\removedConcepts{ator}@>& y);
+ template <@\changedConcepts{class}{EqualityComparable}@ Key, class Compare, class Alloc@\removedConcepts{ator}@>
+ bool operator!=(const set<Key,Compare,Alloc@\removedConcepts{ator}@>& x,
+ const set<Key,Compare,Alloc@\removedConcepts{ator}@>& y);
+ template <@\changedConcepts{class}{LessThanComparable}@ Key, class Compare, class Alloc@\removedConcepts{ator}@>
+ bool operator> (const set<Key,Compare,Alloc@\removedConcepts{ator}@>& x,
+ const set<Key,Compare,Alloc@\removedConcepts{ator}@>& y);
+ template <@\changedConcepts{class}{LessThanComparable}@ Key, class Compare, class Alloc@\removedConcepts{ator}@>
+ bool operator>=(const set<Key,Compare,Alloc@\removedConcepts{ator}@>& x,
+ const set<Key,Compare,Alloc@\removedConcepts{ator}@>& y);
+ template <@\changedConcepts{class}{LessThanComparable}@ Key, class Compare, class Alloc@\removedConcepts{ator}@>
+ bool operator<=(const set<Key,Compare,Alloc@\removedConcepts{ator}@>& x,
+ const set<Key,Compare,Alloc@\removedConcepts{ator}@>& y);
+ template <@\changedConcepts{class}{ObjectType}@ Key, class Compare, class Alloc@\removedConcepts{ator}@>
+ void swap(set<Key,Compare,Alloc@\removedConcepts{ator}@>& x,
+ set<Key,Compare,Alloc@\removedConcepts{ator}@>& y);
+ template <@\changedConcepts{class}{ObjectType}@ Key, class T, class Compare, class Alloc@\removedConcepts{ator}@>
+ void swap(set<Key,T,Compare,Alloc@\removedConcepts{ator}@&& x,
+ set<Key,T,Compare,Alloc@\removedConcepts{ator}@>& y);
+ template <@\changedConcepts{class}{ObjectType}@ Key, class T, class Compare, class Alloc@\removedConcepts{ator}@>
+ void swap(set<Key,T,Compare,Alloc@\removedConcepts{ator}@& x,
+ set<Key,T,Compare,Alloc@\removedConcepts{ator}@>&& y);
 
   template <@\changedConcepts{class}{ObjectType}@ Key, @\changedConcepts{class}{Predicate<auto, Key, Key>}@ Compare = less<Key>,
- class Allocator = allocator<Key> >
+ @\changedConcepts{class}{Allocator}@ Alloc@\removedConcepts{ator}@ = allocator<Key> >
     @\addedConcepts{requires Destructible<Key> \&\& CopyConstructible<Compare>}@
+ @\addedConcepts{\&\& ConstructibleAsElement<Alloc, Compare, const Compare\&>}@
+ @\addedConcepts{\&\& ConstructibleAsElement<Alloc, Compare, Compare\&\&>}@
     class multiset;
- template <@\changedConcepts{class}{EqualityComparable}@ Key, class Compare, class Allocator>
- bool operator==(const multiset<Key,Compare,Allocator>& x,
- const multiset<Key,Compare,Allocator>& y);
- template <@\changedConcepts{class}{LessThanComparable}@ Key, class Compare, class Allocator>
- bool operator< (const multiset<Key,Compare,Allocator>& x,
- const multiset<Key,Compare,Allocator>& y);
- template <@\changedConcepts{class}{EqualityComparable}@ Key, class Compare, class Allocator>
- bool operator!=(const multiset<Key,Compare,Allocator>& x,
- const multiset<Key,Compare,Allocator>& y);
- template <@\changedConcepts{class}{LessThanComparable}@ Key, class Compare, class Allocator>
- bool operator> (const multiset<Key,Compare,Allocator>& x,
- const multiset<Key,Compare,Allocator>& y);
- template <@\changedConcepts{class}{LessThanComparable}@ Key, class Compare, class Allocator>
- bool operator>=(const multiset<Key,Compare,Allocator>& x,
- const multiset<Key,Compare,Allocator>& y);
- template <@\changedConcepts{class}{LessThanComparable}@ Key, class Compare, class Allocator>
- bool operator<=(const multiset<Key,Compare,Allocator>& x,
- const multiset<Key,Compare,Allocator>& y);
- template <@\changedConcepts{class}{ObjectType}@ Key, class Compare, class Allocator>
- void swap(multiset<Key,Compare,Allocator>& x,
- multiset<Key,Compare,Allocator>& y);
- template <@\changedConcepts{class}{ObjectType}@ Key, class T, class Compare, class Allocator>
- void swap(multiset<Key,T,Compare,Allocator&& x,
- multiset<Key,T,Compare,Allocator>& y);
- template <@\changedConcepts{class}{ObjectType}@ Key, class T, class Compare, class Allocator>
- void swap(multiset<Key,T,Compare,Allocator& x,
- multiset<Key,T,Compare,Allocator>&& y);
+ template <@\changedConcepts{class}{EqualityComparable}@ Key, class Compare, class Alloc@\removedConcepts{ator}@>
+ bool operator==(const multiset<Key,Compare,Alloc@\removedConcepts{ator}@>& x,
+ const multiset<Key,Compare,Alloc@\removedConcepts{ator}@>& y);
+ template <@\changedConcepts{class}{LessThanComparable}@ Key, class Compare, class Alloc@\removedConcepts{ator}@>
+ bool operator< (const multiset<Key,Compare,Alloc@\removedConcepts{ator}@>& x,
+ const multiset<Key,Compare,Alloc@\removedConcepts{ator}@>& y);
+ template <@\changedConcepts{class}{EqualityComparable}@ Key, class Compare, class Alloc@\removedConcepts{ator}@>
+ bool operator!=(const multiset<Key,Compare,Alloc@\removedConcepts{ator}@>& x,
+ const multiset<Key,Compare,Alloc@\removedConcepts{ator}@>& y);
+ template <@\changedConcepts{class}{LessThanComparable}@ Key, class Compare, class Alloc@\removedConcepts{ator}@>
+ bool operator> (const multiset<Key,Compare,Alloc@\removedConcepts{ator}@>& x,
+ const multiset<Key,Compare,Alloc@\removedConcepts{ator}@>& y);
+ template <@\changedConcepts{class}{LessThanComparable}@ Key, class Compare, class Alloc@\removedConcepts{ator}@>
+ bool operator>=(const multiset<Key,Compare,Alloc@\removedConcepts{ator}@>& x,
+ const multiset<Key,Compare,Alloc@\removedConcepts{ator}@>& y);
+ template <@\changedConcepts{class}{LessThanComparable}@ Key, class Compare, class Alloc@\removedConcepts{ator}@>
+ bool operator<=(const multiset<Key,Compare,Alloc@\removedConcepts{ator}@>& x,
+ const multiset<Key,Compare,Alloc@\removedConcepts{ator}@>& y);
+ template <@\changedConcepts{class}{ObjectType}@ Key, class Compare, class Alloc@\removedConcepts{ator}@>
+ void swap(multiset<Key,Compare,Alloc@\removedConcepts{ator}@>& x,
+ multiset<Key,Compare,Alloc@\removedConcepts{ator}@>& y);
+ template <@\changedConcepts{class}{ObjectType}@ Key, class T, class Compare, class Alloc@\removedConcepts{ator}@>
+ void swap(multiset<Key,T,Compare,Alloc@\removedConcepts{ator}@&& x,
+ multiset<Key,T,Compare,Alloc@\removedConcepts{ator}@>& y);
+ template <@\changedConcepts{class}{ObjectType}@ Key, class T, class Compare, class Alloc@\removedConcepts{ator}@>
+ void swap(multiset<Key,T,Compare,Alloc@\removedConcepts{ator}@& x,
+ multiset<Key,T,Compare,Alloc@\removedConcepts{ator}@>&& y);
 }
 \end{codeblock}
 
@@ -4829,8 +4837,10 @@
 namespace std {
   template <@\changedConcepts{class}{ObjectType}@ Key, @\changedConcepts{class}{ObjectType}@ T,
             @\changedConcepts{class}{Predicate<auto, Key, Key>}@ Compare = less<Key>,
- class Allocator = allocator<pair<const Key, T> > >
+ @\changedConcepts{class}{Allocator}@ Alloc@\removedConcepts{ator}@ = allocator<pair<const Key, T> > >
   @\addedConcepts{requires Destructible<Key> \&\& Destructible<T> \&\& CopyConstructible<Compare>}@
+ @\addedConcepts{\&\& ConstructibleAsElement<Alloc, Compare, const Compare\&>}@
+ @\addedConcepts{\&\& ConstructibleAsElement<Alloc, Compare, Compare\&\&>}@
   class map {
   public:
     // types:
@@ -4838,15 +4848,15 @@
     typedef T mapped_type;
     typedef pair<const Key, T> value_type;
     typedef Compare key_compare;
- typedef Allocator allocator_type;
- typedef typename Allocator::reference reference;
- typedef typename Allocator::const_reference const_reference;
+ typedef Alloc@\removedConcepts{ator}@ allocator_type;
+ typedef typename Alloc@\removedConcepts{ator}@::reference reference;
+ typedef typename Alloc@\removedConcepts{ator}@::const_reference const_reference;
     typedef @\impdef@ iterator; // See \ref{container.requirements}
     typedef @\impdef@ const_iterator; // See \ref{container.requirements}
     typedef @\impdef@ size_type; // See \ref{container.requirements}
     typedef @\impdef@ difference_type;// See \ref{container.requirements}
- typedef typename Allocator::pointer pointer;
- typedef typename Allocator::const_pointer const_pointer;
+ typedef typename Alloc@\removedConcepts{ator}@::pointer pointer;
+ typedef typename Alloc@\removedConcepts{ator}@::const_pointer const_pointer;
     typedef std::reverse_iterator<iterator> reverse_iterator;
     typedef std::reverse_iterator<const_iterator> const_reverse_iterator;
 
@@ -4864,21 +4874,21 @@
 
     // \ref{map.cons} construct/copy/destroy:
     explicit map(const Compare& comp = Compare(),
- const Allocator& = Allocator());
+ const Alloc@\removedConcepts{ator}@& = Alloc@\removedConcepts{ator}@());
     template <@\changedConcepts{class InputIterator}{InputIterator Iter}@>
       @\addedConcepts{requires HasConstructor<value_type, Iter::reference>}@
       map(@\changedConcepts{InputIterator}{Iter}@ first, @\changedConcepts{InputIterator}{Iter}@ last,
- const Compare& comp = Compare(), const Allocator& = Allocator());
- @\addedConcepts{requires CopyConstructible<value_type>}@ map(const map<Key,T,Compare,Allocator>& x);
- map(map<Key,T,Compare,Allocator>&& x);
- map(const Allocator&);
- @\addedConcepts{requires CopyConstructible<value_type>}@ map(const map&, const Allocator&);
- map(map&&, const Allocator&);
+ const Compare& comp = Compare(), const Alloc@\removedConcepts{ator}@& = Alloc@\removedConcepts{ator}@());
+ @\addedConcepts{requires ConstructibleAsElement<Alloc, value_type, const value_type\&>}@ map(const map<Key,T,Compare,Alloc@\removedConcepts{ator}@>& x);
+ map(map<Key,T,Compare,Alloc@\removedConcepts{ator}@>&& x);
+ map(const Alloc@\removedConcepts{ator}@&);
+ @\addedConcepts{requires ConstructibleAsElement<Alloc, value_type, const value_type\&>}@ map(const map&, const Alloc@\removedConcepts{ator}@&);
+ map(map&&, const Alloc@\removedConcepts{ator}@&);
    ~map();
- @\addedConcepts{requires CopyConstructible<value_type> \&\& CopyAssignable<value_type>}@
- map<Key,T,Compare,Allocator>& operator=(const map<Key,T,Compare,Allocator>& x);
- map<Key,T,Compare,Allocator>&
- operator=(map<Key,T,Compare,Allocator>&& x);
+ @\addedConcepts{requires ConstructibleAsElement<Alloc, value_type, const value_type\&> \&\& CopyAssignable<value_type>}@
+ map<Key,T,Compare,Alloc@\removedConcepts{ator}@>& operator=(const map<Key,T,Compare,Alloc@\removedConcepts{ator}@>& x);
+ map<Key,T,Compare,Alloc@\removedConcepts{ator}@>&
+ operator=(map<Key,T,Compare,Alloc@\removedConcepts{ator}@>&& x);
     allocator_type get_allocator() const;
 
     // iterators:
@@ -4915,11 +4925,11 @@
     template <class... Args>
       @\addedConcepts{requires HasConstructor<value_type, Args\&\&...>}@
       iterator emplace(const_iterator position, Args&&... args);
- @\addedConcepts{requires CopyConstructible<value_type>}@ pair<iterator, bool> insert(const value_type& x);
+ @\addedConcepts{requires ConstructibleAsElement<Alloc, value_type, const value_type\&>}@ pair<iterator, bool> insert(const value_type& x);
     template <class P>
       @\addedConcepts{requires HasConstructor<value_type, P\&\&> \&\& Convertible<P, value_type>}@
       pair<iterator, bool> insert(P&& x);
- @\addedConcepts{requires CopyConstructible<value_type>}@ iterator insert(const_iterator position, const value_type& x);
+ @\addedConcepts{requires ConstructibleAsElement<Alloc, value_type, const value_type\&>}@ iterator insert(const_iterator position, const value_type& x);
     template <class P>
       @\addedConcepts{requires HasConstructor<value_type, P\&\&> \&\& Convertible<P, value_type>}@
       iterator insert(const_iterator position, P&&);
@@ -4930,7 +4940,7 @@
     iterator erase(const_iterator position);
     size_type erase(const key_type& x);
     iterator erase(const_iterator first, const_iterator last);
- void swap(map<Key,T,Compare,Allocator>&&);
+ void swap(map<Key,T,Compare,Alloc@\removedConcepts{ator}@>&&);
     void clear();
 
     // observers:
@@ -4953,40 +4963,40 @@
       equal_range(const key_type& x) const;
   };
 
- template <@\changedConcepts{class}{EqualityComparable}@ Key, @\changedConcepts{class}{EqualityComparable}@ T, class Compare, class Allocator>
- bool operator==(const map<Key,T,Compare,Allocator>& x,
- const map<Key,T,Compare,Allocator>& y);
- template <@\changedConcepts{class}{LessThanComparable}@ Key, @\changedConcepts{class}{LessThanComparable}@ T, class Compare, class Allocator>
- bool operator< (const map<Key,T,Compare,Allocator>& x,
- const map<Key,T,Compare,Allocator>& y);
- template <@\changedConcepts{class}{EqualityComparable}@ Key, @\changedConcepts{class}{EqualityComparable}@ T, class Compare, class Allocator>
- bool operator!=(const map<Key,T,Compare,Allocator>& x,
- const map<Key,T,Compare,Allocator>& y);
- template <@\changedConcepts{class}{LessThanComparable}@ Key, @\changedConcepts{class}{LessThanComparable}@ T, class Compare, class Allocator>
- bool operator> (const map<Key,T,Compare,Allocator>& x,
- const map<Key,T,Compare,Allocator>& y);
- template <@\changedConcepts{class}{LessThanComparable}@ Key, @\changedConcepts{class}{LessThanComparable}@ T, class Compare, class Allocator>
- bool operator>=(const map<Key,T,Compare,Allocator>& x,
- const map<Key,T,Compare,Allocator>& y);
- template <@\changedConcepts{class}{LessThanComparable}@ Key, @\changedConcepts{class}{LessThanComparable}@ T, class Compare, class Allocator>
- bool operator<=(const map<Key,T,Compare,Allocator>& x,
- const map<Key,T,Compare,Allocator>& y);
+ template <@\changedConcepts{class}{EqualityComparable}@ Key, @\changedConcepts{class}{EqualityComparable}@ T, class Compare, class Alloc@\removedConcepts{ator}@>
+ bool operator==(const map<Key,T,Compare,Alloc@\removedConcepts{ator}@>& x,
+ const map<Key,T,Compare,Alloc@\removedConcepts{ator}@>& y);
+ template <@\changedConcepts{class}{LessThanComparable}@ Key, @\changedConcepts{class}{LessThanComparable}@ T, class Compare, class Alloc@\removedConcepts{ator}@>
+ bool operator< (const map<Key,T,Compare,Alloc@\removedConcepts{ator}@>& x,
+ const map<Key,T,Compare,Alloc@\removedConcepts{ator}@>& y);
+ template <@\changedConcepts{class}{EqualityComparable}@ Key, @\changedConcepts{class}{EqualityComparable}@ T, class Compare, class Alloc@\removedConcepts{ator}@>
+ bool operator!=(const map<Key,T,Compare,Alloc@\removedConcepts{ator}@>& x,
+ const map<Key,T,Compare,Alloc@\removedConcepts{ator}@>& y);
+ template <@\changedConcepts{class}{LessThanComparable}@ Key, @\changedConcepts{class}{LessThanComparable}@ T, class Compare, class Alloc@\removedConcepts{ator}@>
+ bool operator> (const map<Key,T,Compare,Alloc@\removedConcepts{ator}@>& x,
+ const map<Key,T,Compare,Alloc@\removedConcepts{ator}@>& y);
+ template <@\changedConcepts{class}{LessThanComparable}@ Key, @\changedConcepts{class}{LessThanComparable}@ T, class Compare, class Alloc@\removedConcepts{ator}@>
+ bool operator>=(const map<Key,T,Compare,Alloc@\removedConcepts{ator}@>& x,
+ const map<Key,T,Compare,Alloc@\removedConcepts{ator}@>& y);
+ template <@\changedConcepts{class}{LessThanComparable}@ Key, @\changedConcepts{class}{LessThanComparable}@ T, class Compare, class Alloc@\removedConcepts{ator}@>
+ bool operator<=(const map<Key,T,Compare,Alloc@\removedConcepts{ator}@>& x,
+ const map<Key,T,Compare,Alloc@\removedConcepts{ator}@>& y);
 
   // specialized algorithms:
- template <@\changedConcepts{class}{ObjectType}@ Key, @\changedConcepts{class}{ObjectType}@ T, class Compare, class Allocator>
- void swap(map<Key,T,Compare,Allocator>& x,
- map<Key,T,Compare,Allocator>& y);
- template <@\changedConcepts{class}{ObjectType}@ Key, @\changedConcepts{class}{ObjectType}@ T, class Compare, class Allocator>
- void swap(map<Key,T,Compare,Allocator&& x,
- map<Key,T,Compare,Allocator>& y);
- template <@\changedConcepts{class}{ObjectType}@ Key, @\changedConcepts{class}{ObjectType}@ T, class Compare, class Allocator>
- void swap(map<Key,T,Compare,Allocator& x,
- map<Key,T,Compare,Allocator>&& y);
-
- template <class Key, class T, class Compare, class Alloc>
- struct constructible_with_allocator_suffix<
- map<Key, T, Compare, Alloc> >
- : true_type { };
+ template <@\changedConcepts{class}{ObjectType}@ Key, @\changedConcepts{class}{ObjectType}@ T, class Compare, class Alloc@\removedConcepts{ator}@>
+ void swap(map<Key,T,Compare,Alloc@\removedConcepts{ator}@>& x,
+ map<Key,T,Compare,Alloc@\removedConcepts{ator}@>& y);
+ template <@\changedConcepts{class}{ObjectType}@ Key, @\changedConcepts{class}{ObjectType}@ T, class Compare, class Alloc@\removedConcepts{ator}@>
+ void swap(map<Key,T,Compare,Alloc@\removedConcepts{ator}@&& x,
+ map<Key,T,Compare,Alloc@\removedConcepts{ator}@>& y);
+ template <@\changedConcepts{class}{ObjectType}@ Key, @\changedConcepts{class}{ObjectType}@ T, class Compare, class Alloc@\removedConcepts{ator}@>
+ void swap(map<Key,T,Compare,Alloc@\removedConcepts{ator}@& x,
+ map<Key,T,Compare,Alloc@\removedConcepts{ator}@>&& y);
+
+ @\removedConcepts{template <class Key, class T, class Compare, class Alloc>}@
+ @\removedConcepts{struct constructible_with_allocator_suffix<}@
+ @\removedConcepts{map<Key, T, Compare, Alloc> >}@
+ @\removedConcepts{: true_type \{ \};}@
 }
 \end{codeblock}%
 
@@ -4997,7 +5007,7 @@
 
 \begin{itemdecl}
 explicit map(const Compare& comp = Compare(),
- const Allocator& = Allocator());
+ const Alloc@\removedConcepts{ator}@& = Alloc@\removedConcepts{ator}@());
 \end{itemdecl}
 
 \begin{itemdescr}
@@ -5016,7 +5026,7 @@
 template <@\changedConcepts{class InputIterator}{InputIterator Iter}@>
   @\addedConcepts{requires HasConstructor<value_type, Iter::reference>}@
   map(@\changedConcepts{InputIterator}{Iter}@ first, @\changedConcepts{InputIterator}{Iter}@ last,
- const Compare& comp = Compare(), const Allocator& = Allocator());
+ const Compare& comp = Compare(), const Alloc@\removedConcepts{ator}@& = Alloc@\removedConcepts{ator}@());
 \end{itemdecl}
 
 \begin{itemdescr}
@@ -5198,15 +5208,15 @@
 \rSec3[map.special]{\tcode{map}\ specialized algorithms}
 
 \begin{itemdecl}
-template <@\changedConcepts{class}{ObjectType}@ Key, @\changedConcepts{class}{ObjectType}@ T, class Compare, class Allocator>
- void swap(map<Key,T,Compare,Allocator>& x,
- map<Key,T,Compare,Allocator>& y);
-template <@\changedConcepts{class}{ObjectType}@ Key, @\changedConcepts{class}{ObjectType}@ T, class Compare, class Allocator>
- void swap(map<Key,T,Compare,Allocator>&& x,
- map<Key,T,Compare,Allocator>& y);
-template <@\changedConcepts{class}{ObjectType}@ Key, @\changedConcepts{class}{ObjectType}@ T, class Compare, class Allocator>
- void swap(map<Key,T,Compare,Allocator>& x,
- map<Key,T,Compare,Allocator>&& y);
+template <@\changedConcepts{class}{ObjectType}@ Key, @\changedConcepts{class}{ObjectType}@ T, class Compare, class Alloc@\removedConcepts{ator}@>
+ void swap(map<Key,T,Compare,Alloc@\removedConcepts{ator}@>& x,
+ map<Key,T,Compare,Alloc@\removedConcepts{ator}@>& y);
+template <@\changedConcepts{class}{ObjectType}@ Key, @\changedConcepts{class}{ObjectType}@ T, class Compare, class Alloc@\removedConcepts{ator}@>
+ void swap(map<Key,T,Compare,Alloc@\removedConcepts{ator}@>&& x,
+ map<Key,T,Compare,Alloc@\removedConcepts{ator}@>& y);
+template <@\changedConcepts{class}{ObjectType}@ Key, @\changedConcepts{class}{ObjectType}@ T, class Compare, class Alloc@\removedConcepts{ator}@>
+ void swap(map<Key,T,Compare,Alloc@\removedConcepts{ator}@>& x,
+ map<Key,T,Compare,Alloc@\removedConcepts{ator}@>&& y);
 \end{itemdecl}
 
 \begin{itemdescr}
@@ -5270,8 +5280,10 @@
 namespace std {
   template <@\changedConcepts{class}{ObjectType}@ Key, @\changedConcepts{class}{ObjectType}@ T,
             @\changedConcepts{class}{Predicate<auto, Key, Key>}@ Compare = less<Key>,
- class Allocator = allocator<pair<const Key, T> > >
+ @\changedConcepts{class}{Allocator}@ Alloc@\removedConcepts{ator}@ = allocator<pair<const Key, T> > >
     @\addedConcepts{requires Destructible<Key> \&\& Destructible<T> \&\& CopyConstructible<Compare>}@
+ @\addedConcepts{\&\& ConstructibleAsElement<Alloc, Compare, const Compare\&>}@
+ @\addedConcepts{\&\& ConstructibleAsElement<Alloc, Compare, Compare\&\&>}@
   class multimap {
   public:
     // types:
@@ -5279,15 +5291,15 @@
     typedef T mapped_type;
     typedef pair<const Key,T> value_type;
     typedef Compare key_compare;
- typedef Allocator allocator_type;
- typedef typename Allocator::reference reference;
- typedef typename Allocator::const_reference const_reference;
+ typedef Alloc@\removedConcepts{ator}@ allocator_type;
+ typedef typename Alloc@\removedConcepts{ator}@::reference reference;
+ typedef typename Alloc@\removedConcepts{ator}@::const_reference const_reference;
     typedef @\impdef@ iterator; // See \ref{container.requirements}
     typedef @\impdef@ const_iterator; // See \ref{container.requirements}
     typedef @\impdef@ size_type; // See \ref{container.requirements}
     typedef @\impdef@ difference_type;// See \ref{container.requirements}
- typedef typename Allocator::pointer pointer;
- typedef typename Allocator::const_pointer const_pointer;
+ typedef typename Alloc@\removedConcepts{ator}@::pointer pointer;
+ typedef typename Alloc@\removedConcepts{ator}@::const_pointer const_pointer;
     typedef std::reverse_iterator<iterator> reverse_iterator;
     typedef std::reverse_iterator<const_iterator> const_reverse_iterator;
 
@@ -5305,21 +5317,21 @@
 
     // construct/copy/destroy:
     explicit multimap(const Compare& comp = Compare(),
- const Allocator& = Allocator());
+ const Alloc@\removedConcepts{ator}@& = Alloc@\removedConcepts{ator}@());
     template <@\changedConcepts{class InputIterator}{InputIterator Iter}@>
       @\addedConcepts{requires HasConstructor<value_type, Iter::reference>}@
       multimap(@\changedConcepts{InputIterator}{Iter}@ first, @\changedConcepts{InputIterator}{Iter}@ last,
- const Compare& comp = Compare(), const Allocator& = Allocator());
- @\addedConcepts{requires CopyConstructible<value_type>}@ multimap(const multimap<Key,T,Compare,Allocator>& x);
- multimap(multimap<Key,T,Compare,Allocator>&& x);
- multimap(const Allocator&);
- @\addedConcepts{requires CopyConstructible<value_type>}@ multimap(const multimap&, const Allocator&);
- multimap(multimap&&, const Allocator&);
+ const Compare& comp = Compare(), const Alloc@\removedConcepts{ator}@& = Alloc@\removedConcepts{ator}@());
+ @\addedConcepts{requires ConstructibleAsElement<Alloc, value_type, const value_type\&>}@ multimap(const multimap<Key,T,Compare,Alloc@\removedConcepts{ator}@>& x);
+ multimap(multimap<Key,T,Compare,Alloc@\removedConcepts{ator}@>&& x);
+ multimap(const Alloc@\removedConcepts{ator}@&);
+ @\addedConcepts{requires ConstructibleAsElement<Alloc, value_type, const value_type\&>}@ multimap(const multimap&, const Alloc@\removedConcepts{ator}@&);
+ multimap(multimap&&, const Alloc@\removedConcepts{ator}@&);
    ~multimap();
- @\addedConcepts{requires CopyConstructible<value_type> \&\& CopyAssignable<value_type>}@
- multimap<Key,T,Compare,Allocator>& operator=(const multimap<Key,T,Compare,Allocator>& x);
- multimap<Key,T,Compare,Allocator>&
- operator=(const multimap<Key,T,Compare,Allocator>&& x);
+ @\addedConcepts{requires ConstructibleAsElement<Alloc, value_type, const value_type\&> \&\& CopyAssignable<value_type>}@
+ multimap<Key,T,Compare,Alloc@\removedConcepts{ator}@>& operator=(const multimap<Key,T,Compare,Alloc@\removedConcepts{ator}@>& x);
+ multimap<Key,T,Compare,Alloc@\removedConcepts{ator}@>&
+ operator=(const multimap<Key,T,Compare,Alloc@\removedConcepts{ator}@>&& x);
     allocator_type get_allocator() const;
 
     // iterators:
@@ -5350,11 +5362,11 @@
     template <class... Args>
       @\addedConcepts{requires HasConstructor<value_type, Args\&\&...>}@
       iterator emplace(const_iterator position, Args&&... args);
- @\addedConcepts{requires CopyConstructible<value_type>}@ iterator insert(const value_type& x);
+ @\addedConcepts{requires ConstructibleAsElement<Alloc, value_type, const value_type\&>}@ iterator insert(const value_type& x);
     template <class P>
       @\addedConcepts{requires HasConstructor<value_type, P\&\&> \&\& Convertible<P, value_type>}@
       iterator insert(P&& x);
- @\addedConcepts{requires CopyConstructible<value_type>}@ iterator insert(const_iterator position, const value_type& x);
+ @\addedConcepts{requires ConstructibleAsElement<Alloc, value_type, const value_type\&>}@ iterator insert(const_iterator position, const value_type& x);
     template <class P>
       @\addedConcepts{requires HasConstructor<value_type, P\&\&> \&\& Convertible<P, value_type>}@
       iterator insert(const_iterator position, P&& x);
@@ -5365,7 +5377,7 @@
     iterator erase(const_iterator position);
     size_type erase(const key_type& x);
     iterator erase(const_iterator first, const_iterator last);
- void swap(multimap<Key,T,Compare,Allocator>&&);
+ void swap(multimap<Key,T,Compare,Alloc@\removedConcepts{ator}@>&&);
     void clear();
 
     // observers:
@@ -5388,40 +5400,40 @@
       equal_range(const key_type& x) const;
   };
 
- template <@\changedConcepts{class}{EqualityComparable}@ Key, @\changedConcepts{class}{EqualityComparable}@ T, class Compare, class Allocator>
- bool operator==(const multimap<Key,T,Compare,Allocator>& x,
- const multimap<Key,T,Compare,Allocator>& y);
- template <@\changedConcepts{class}{LessThanComparable}@ Key, @\changedConcepts{class}{LessThanComparable}@ T, class Compare, class Allocator>
- bool operator< (const multimap<Key,T,Compare,Allocator>& x,
- const multimap<Key,T,Compare,Allocator>& y);
- template <@\changedConcepts{class}{EqualityComparable}@ Key, @\changedConcepts{class}{EqualityComparable}@ T, class Compare, class Allocator>
- bool operator!=(const multimap<Key,T,Compare,Allocator>& x,
- const multimap<Key,T,Compare,Allocator>& y);
- template <@\changedConcepts{class}{LessThanComparable}@ Key, @\changedConcepts{class}{LessThanComparable}@ T, class Compare, class Allocator>
- bool operator> (const multimap<Key,T,Compare,Allocator>& x,
- const multimap<Key,T,Compare,Allocator>& y);
- template <@\changedConcepts{class}{LessThanComparable}@ Key, @\changedConcepts{class}{LessThanComparable}@ T, class Compare, class Allocator>
- bool operator>=(const multimap<Key,T,Compare,Allocator>& x,
- const multimap<Key,T,Compare,Allocator>& y);
- template <@\changedConcepts{class}{LessThanComparable}@ Key, @\changedConcepts{class}{LessThanComparable}@ T, class Compare, class Allocator>
- bool operator<=(const multimap<Key,T,Compare,Allocator>& x,
- const multimap<Key,T,Compare,Allocator>& y);
+ template <@\changedConcepts{class}{EqualityComparable}@ Key, @\changedConcepts{class}{EqualityComparable}@ T, class Compare, class Alloc@\removedConcepts{ator}@>
+ bool operator==(const multimap<Key,T,Compare,Alloc@\removedConcepts{ator}@>& x,
+ const multimap<Key,T,Compare,Alloc@\removedConcepts{ator}@>& y);
+ template <@\changedConcepts{class}{LessThanComparable}@ Key, @\changedConcepts{class}{LessThanComparable}@ T, class Compare, class Alloc@\removedConcepts{ator}@>
+ bool operator< (const multimap<Key,T,Compare,Alloc@\removedConcepts{ator}@>& x,
+ const multimap<Key,T,Compare,Alloc@\removedConcepts{ator}@>& y);
+ template <@\changedConcepts{class}{EqualityComparable}@ Key, @\changedConcepts{class}{EqualityComparable}@ T, class Compare, class Alloc@\removedConcepts{ator}@>
+ bool operator!=(const multimap<Key,T,Compare,Alloc@\removedConcepts{ator}@>& x,
+ const multimap<Key,T,Compare,Alloc@\removedConcepts{ator}@>& y);
+ template <@\changedConcepts{class}{LessThanComparable}@ Key, @\changedConcepts{class}{LessThanComparable}@ T, class Compare, class Alloc@\removedConcepts{ator}@>
+ bool operator> (const multimap<Key,T,Compare,Alloc@\removedConcepts{ator}@>& x,
+ const multimap<Key,T,Compare,Alloc@\removedConcepts{ator}@>& y);
+ template <@\changedConcepts{class}{LessThanComparable}@ Key, @\changedConcepts{class}{LessThanComparable}@ T, class Compare, class Alloc@\removedConcepts{ator}@>
+ bool operator>=(const multimap<Key,T,Compare,Alloc@\removedConcepts{ator}@>& x,
+ const multimap<Key,T,Compare,Alloc@\removedConcepts{ator}@>& y);
+ template <@\changedConcepts{class}{LessThanComparable}@ Key, @\changedConcepts{class}{LessThanComparable}@ T, class Compare, class Alloc@\removedConcepts{ator}@>
+ bool operator<=(const multimap<Key,T,Compare,Alloc@\removedConcepts{ator}@>& x,
+ const multimap<Key,T,Compare,Alloc@\removedConcepts{ator}@>& y);
 
   // specialized algorithms:
- template <@\changedConcepts{class}{ObjectType}@ Key, @\changedConcepts{class}{ObjectType}@ T, class Compare, class Allocator>
- void swap(multimap<Key,T,Compare,Allocator>& x,
- multimap<Key,T,Compare,Allocator>& y);
- template <@\changedConcepts{class}{ObjectType}@ Key, @\changedConcepts{class}{ObjectType}@ T, class Compare, class Allocator>
- void swap(multimap<Key,T,Compare,Allocator&& x,
- multimap<Key,T,Compare,Allocator>& y);
- template <@\changedConcepts{class}{ObjectType}@ Key, @\changedConcepts{class}{ObjectType}@ T, class Compare, class Allocator>
- void swap(multimap<Key,T,Compare,Allocator& x,
- multimap<Key,T,Compare,Allocator>&& y);
-
- template <class Key, class T, class Compare, class Alloc>
- struct constructible_with_allocator_suffix<
- multimap<Key, T, Compare, Alloc> >
- : true_type { };
+ template <@\changedConcepts{class}{ObjectType}@ Key, @\changedConcepts{class}{ObjectType}@ T, class Compare, class Alloc@\removedConcepts{ator}@>
+ void swap(multimap<Key,T,Compare,Alloc@\removedConcepts{ator}@>& x,
+ multimap<Key,T,Compare,Alloc@\removedConcepts{ator}@>& y);
+ template <@\changedConcepts{class}{ObjectType}@ Key, @\changedConcepts{class}{ObjectType}@ T, class Compare, class Alloc@\removedConcepts{ator}@>
+ void swap(multimap<Key,T,Compare,Alloc@\removedConcepts{ator}@&& x,
+ multimap<Key,T,Compare,Alloc@\removedConcepts{ator}@>& y);
+ template <@\changedConcepts{class}{ObjectType}@ Key, @\changedConcepts{class}{ObjectType}@ T, class Compare, class Alloc@\removedConcepts{ator}@>
+ void swap(multimap<Key,T,Compare,Alloc@\removedConcepts{ator}@& x,
+ multimap<Key,T,Compare,Alloc@\removedConcepts{ator}@>&& y);
+
+ @\removedConcepts{template <class Key, class T, class Compare, class Alloc>}@
+ @\removedConcepts{struct constructible_with_allocator_suffix<}@
+ @\removedConcepts{multimap<Key, T, Compare, Alloc> >}@
+ @\removedConcepts{: true_type \{ \};}@
 }
 \end{codeblock}%
 \index{multimap@\tcode{multimap}!\tcode{operator==}}%
@@ -5431,7 +5443,7 @@
 
 \begin{itemdecl}
 explicit multimap(const Compare& comp = Compare(),
- const Allocator& = Allocator());
+ const Alloc@\removedConcepts{ator}@& = Alloc@\removedConcepts{ator}@());
 \end{itemdecl}
 
 \begin{itemdescr}
@@ -5450,7 +5462,7 @@
 template <@\changedConcepts{class InputIterator}{InputIterator Iter}@>
   @\addedConcepts{requires HasConstructor<value_type, Iter::reference>}@
   multimap(@\changedConcepts{InputIterator}{Iter}@ first, @\changedConcepts{InputIterator}{Iter}@ last,
- const Compare& comp = Compare(), const Allocator& = Allocator());
+ const Compare& comp = Compare(), const Alloc@\removedConcepts{ator}@& = Alloc@\removedConcepts{ator}@());
 \end{itemdecl}
 
 \begin{itemdescr}
@@ -5549,15 +5561,15 @@
 \rSec3[multimap.special]{\tcode{multimap}\ specialized algorithms}
 
 \begin{itemdecl}
-template <@\changedConcepts{class}{ObjectType}@ Key, @\changedConcepts{class}{ObjectType}@ T, class Compare, class Allocator>
- void swap(multimap<Key,T,Compare,Allocator>& x,
- multimap<Key,T,Compare,Allocator>& y);
-template <@\changedConcepts{class}{ObjectType}@ Key, @\changedConcepts{class}{ObjectType}@ T, class Compare, class Allocator>
- void swap(multimap<Key,T,Compare,Allocator>&& x,
- multimap<Key,T,Compare,Allocator>& y);
-template <@\changedConcepts{class}{ObjectType}@ Key, @\changedConcepts{class}{ObjectType}@ T, class Compare, class Allocator>
- void swap(multimap<Key,T,Compare,Allocator>& x,
- multimap<Key,T,Compare,Allocator>&& y);
+template <@\changedConcepts{class}{ObjectType}@ Key, @\changedConcepts{class}{ObjectType}@ T, class Compare, class Alloc@\removedConcepts{ator}@>
+ void swap(multimap<Key,T,Compare,Alloc@\removedConcepts{ator}@>& x,
+ multimap<Key,T,Compare,Alloc@\removedConcepts{ator}@>& y);
+template <@\changedConcepts{class}{ObjectType}@ Key, @\changedConcepts{class}{ObjectType}@ T, class Compare, class Alloc@\removedConcepts{ator}@>
+ void swap(multimap<Key,T,Compare,Alloc@\removedConcepts{ator}@>&& x,
+ multimap<Key,T,Compare,Alloc@\removedConcepts{ator}@>& y);
+template <@\changedConcepts{class}{ObjectType}@ Key, @\changedConcepts{class}{ObjectType}@ T, class Compare, class Alloc@\removedConcepts{ator}@>
+ void swap(multimap<Key,T,Compare,Alloc@\removedConcepts{ator}@>& x,
+ multimap<Key,T,Compare,Alloc@\removedConcepts{ator}@>&& y);
 \end{itemdecl}
 
 \begin{itemdescr}
@@ -5614,8 +5626,10 @@
 \begin{codeblock}
 namespace std {
   template <@\changedConcepts{class}{ObjectType}@ Key, @\changedConcepts{class}{Predicate<auto, Key, Key>}@ Compare = less<Key>,
- class Allocator = allocator<Key> >
+ @\changedConcepts{class}{Allocator}@ Alloc@\removedConcepts{ator}@ = allocator<Key> >
   @\addedConcepts{requires Destructible<Key> \&\& CopyConstructible<Compare>}@
+ @\addedConcepts{\&\& ConstructibleAsElement<Alloc, Compare, const Compare\&>}@
+ @\addedConcepts{\&\& ConstructibleAsElement<Alloc, Compare, Compare\&\&>}@
   class set {
   public:
     // types:
@@ -5623,35 +5637,35 @@
     typedef Key value_type;
     typedef Compare key_compare;
     typedef Compare value_compare;
- typedef Allocator allocator_type;
- typedef typename Allocator::reference reference;
- typedef typename Allocator::const_reference const_reference;
+ typedef Alloc@\removedConcepts{ator}@ allocator_type;
+ typedef typename Alloc@\removedConcepts{ator}@::reference reference;
+ typedef typename Alloc@\removedConcepts{ator}@::const_reference const_reference;
     typedef @\impdef@ iterator; // See \ref{container.requirements}
     typedef @\impdef@ const_iterator; // See \ref{container.requirements}
     typedef @\impdef@ size_type; // See \ref{container.requirements}
     typedef @\impdef@ difference_type;// See \ref{container.requirements}
- typedef typename Allocator::pointer pointer;
- typedef typename Allocator::const_pointer const_pointer;
+ typedef typename Alloc@\removedConcepts{ator}@::pointer pointer;
+ typedef typename Alloc@\removedConcepts{ator}@::const_pointer const_pointer;
     typedef std::reverse_iterator<iterator> reverse_iterator;
     typedef std::reverse_iterator<const_iterator> const_reverse_iterator;
 
     // \ref{set.cons} construct/copy/destroy:
     explicit set(const Compare& comp = Compare(),
- const Allocator& = Allocator());
+ const Alloc@\removedConcepts{ator}@& = Alloc@\removedConcepts{ator}@());
     template <@\changedConcepts{class InputIterator}{InputIterator Iter}@>
       @\addedConcepts{requires HasConstructor<value_type, Iter::reference>}@
       set(@\changedConcepts{InputIterator}{Iter}@ first, @\changedConcepts{InputIterator}{Iter}@ last,
- const Compare& comp = Compare(), const Allocator& = Allocator());
- @\addedConcepts{requires CopyConstructible<value_type>}@ set(const set<Key,Compare,Allocator>& x);
- set(set<Key,Compare,Allocator>&& x);
- set(const Allocator&);
- @\addedConcepts{requires CopyConstructible<value_type>}@ set(const set&, const Allocator&);
- set(set&&, const Allocator&);
+ const Compare& comp = Compare(), const Alloc@\removedConcepts{ator}@& = Alloc@\removedConcepts{ator}@());
+ @\addedConcepts{requires ConstructibleAsElement<Alloc, value_type, const value_type\&>}@ set(const set<Key,Compare,Alloc@\removedConcepts{ator}@>& x);
+ set(set<Key,Compare,Alloc@\removedConcepts{ator}@>&& x);
+ set(const Alloc@\removedConcepts{ator}@&);
+ @\addedConcepts{requires ConstructibleAsElement<Alloc, value_type, const value_type\&>}@ set(const set&, const Alloc@\removedConcepts{ator}@&);
+ set(set&&, const Alloc@\removedConcepts{ator}@&);
    ~set();
 
- @\addedConcepts{requires CopyConstructible<value_type> \&\& CopyAssignable<value_type>}@
- set<Key,Compare,Allocator>& operator=(const set<Key,Compare,Allocator>& x);
- set<Key,Compare,Allocator>& operator=(set<Key,Compare,Allocator>&& x);
+ @\addedConcepts{requires ConstructibleAsElement<Alloc, value_type, const value_type\&> \&\& CopyAssignable<value_type>}@
+ set<Key,Compare,Alloc@\removedConcepts{ator}@>& operator=(const set<Key,Compare,Alloc@\removedConcepts{ator}@>& x);
+ set<Key,Compare,Alloc@\removedConcepts{ator}@>& operator=(set<Key,Compare,Alloc@\removedConcepts{ator}@>&& x);
     allocator_type get_allocator() const;
 
     // iterators:
@@ -5682,10 +5696,10 @@
     template <class... Args>
       @\addedConcepts{requires HasConstructor<value_type, Args\&\&...>}@
       iterator emplace(const_iterator position, Args&&... args);
- @\addedConcepts{requires CopyConstructible<value_type>}@ pair<iterator,bool> insert(const value_type& x);
- @\addedConcepts{requires MoveConstructible<value_type>}@ pair<iterator,bool> insert(value_type&& x);
- @\addedConcepts{requires CopyConstructible<value_type>}@ iterator insert(const_iterator position, const value_type& x);
- @\addedConcepts{requires MoveConstructible<value_type>}@ iterator insert(const_iterator position, value_type&& x);
+ @\addedConcepts{requires ConstructibleAsElement<Alloc, value_type, const value_type\&>}@ pair<iterator,bool> insert(const value_type& x);
+ @\addedConcepts{requires ConstructibleAsElement<Alloc, value_type, value_type\&\&>}@ pair<iterator,bool> insert(value_type&& x);
+ @\addedConcepts{requires ConstructibleAsElement<Alloc, value_type, const value_type\&>}@ iterator insert(const_iterator position, const value_type& x);
+ @\addedConcepts{requires ConstructibleAsElement<Alloc, value_type, value_type\&\&>}@ iterator insert(const_iterator position, value_type&& x);
     template <@\changedConcepts{class InputIterator}{InputIterator Iter}@>
       @\addedConcepts{requires HasConstructor<value_type, Iter::reference>}@
       void insert(@\changedConcepts{InputIterator}{Iter}@ first, @\changedConcepts{InputIterator}{Iter}@ last);
@@ -5693,7 +5707,7 @@
     iterator erase(const_iterator position);
     size_type erase(const key_type& x);
     iterator erase(const_iterator first, const_iterator last);
- void swap(set<Key,Compare,Allocator>&);
+ void swap(set<Key,Compare,Alloc@\removedConcepts{ator}@>&);
     void clear();
 
     // observers:
@@ -5716,40 +5730,40 @@
     pair<const_iterator,const_iterator> equal_range(const key_type& x) const;
   };
 
- template <@\changedConcepts{class}{EqualityComparable}@ Key, class Compare, class Allocator>
- bool operator==(const set<Key,Compare,Allocator>& x,
- const set<Key,Compare,Allocator>& y);
- template <@\changedConcepts{class}{LessThanComparable}@ Key, class Compare, class Allocator>
- bool operator< (const set<Key,Compare,Allocator>& x,
- const set<Key,Compare,Allocator>& y);
- template <@\changedConcepts{class}{EqualityComparable}@ Key, class Compare, class Allocator>
- bool operator!=(const set<Key,Compare,Allocator>& x,
- const set<Key,Compare,Allocator>& y);
- template <@\changedConcepts{class}{LessThanComparable}@ Key, class Compare, class Allocator>
- bool operator> (const set<Key,Compare,Allocator>& x,
- const set<Key,Compare,Allocator>& y);
- template <@\changedConcepts{class}{LessThanComparable}@ Key, class Compare, class Allocator>
- bool operator>=(const set<Key,Compare,Allocator>& x,
- const set<Key,Compare,Allocator>& y);
- template <@\changedConcepts{class}{LessThanComparable}@ Key, class Compare, class Allocator>
- bool operator<=(const set<Key,Compare,Allocator>& x,
- const set<Key,Compare,Allocator>& y);
+ template <@\changedConcepts{class}{EqualityComparable}@ Key, class Compare, class Alloc@\removedConcepts{ator}@>
+ bool operator==(const set<Key,Compare,Alloc@\removedConcepts{ator}@>& x,
+ const set<Key,Compare,Alloc@\removedConcepts{ator}@>& y);
+ template <@\changedConcepts{class}{LessThanComparable}@ Key, class Compare, class Alloc@\removedConcepts{ator}@>
+ bool operator< (const set<Key,Compare,Alloc@\removedConcepts{ator}@>& x,
+ const set<Key,Compare,Alloc@\removedConcepts{ator}@>& y);
+ template <@\changedConcepts{class}{EqualityComparable}@ Key, class Compare, class Alloc@\removedConcepts{ator}@>
+ bool operator!=(const set<Key,Compare,Alloc@\removedConcepts{ator}@>& x,
+ const set<Key,Compare,Alloc@\removedConcepts{ator}@>& y);
+ template <@\changedConcepts{class}{LessThanComparable}@ Key, class Compare, class Alloc@\removedConcepts{ator}@>
+ bool operator> (const set<Key,Compare,Alloc@\removedConcepts{ator}@>& x,
+ const set<Key,Compare,Alloc@\removedConcepts{ator}@>& y);
+ template <@\changedConcepts{class}{LessThanComparable}@ Key, class Compare, class Alloc@\removedConcepts{ator}@>
+ bool operator>=(const set<Key,Compare,Alloc@\removedConcepts{ator}@>& x,
+ const set<Key,Compare,Alloc@\removedConcepts{ator}@>& y);
+ template <@\changedConcepts{class}{LessThanComparable}@ Key, class Compare, class Alloc@\removedConcepts{ator}@>
+ bool operator<=(const set<Key,Compare,Alloc@\removedConcepts{ator}@>& x,
+ const set<Key,Compare,Alloc@\removedConcepts{ator}@>& y);
 
   // specialized algorithms:
- template <@\changedConcepts{class}{ObjectType}@ Key, class Compare, class Allocator>
- void swap(set<Key,Compare,Allocator>& x,
- set<Key,Compare,Allocator>& y);
- template <@\changedConcepts{class}{ObjectType}@ Key, class Compare, class Allocator>
- void swap(set<Key,Compare,Allocator&& x,
- set<Key,Compare,Allocator>& y);
- template <@\changedConcepts{class}{ObjectType}@ Key, class Compare, class Allocator>
- void swap(set<Key,Compare,Allocator& x,
- set<Key,Compare,Allocator>&& y);
-
- template <class Key, class Compare, class Alloc>
- struct constructible_with_allocator_suffix<
- set<Key, Compare, Alloc> >
- : true_type { };
+ template <@\changedConcepts{class}{ObjectType}@ Key, class Compare, class Alloc@\removedConcepts{ator}@>
+ void swap(set<Key,Compare,Alloc@\removedConcepts{ator}@>& x,
+ set<Key,Compare,Alloc@\removedConcepts{ator}@>& y);
+ template <@\changedConcepts{class}{ObjectType}@ Key, class Compare, class Alloc@\removedConcepts{ator}@>
+ void swap(set<Key,Compare,Alloc@\removedConcepts{ator}@&& x,
+ set<Key,Compare,Alloc@\removedConcepts{ator}@>& y);
+ template <@\changedConcepts{class}{ObjectType}@ Key, class Compare, class Alloc@\removedConcepts{ator}@>
+ void swap(set<Key,Compare,Alloc@\removedConcepts{ator}@& x,
+ set<Key,Compare,Alloc@\removedConcepts{ator}@>&& y);
+
+ @\removedConcepts{template <class Key, class Compare, class Alloc>}@
+ @\removedConcepts{struct constructible_with_allocator_suffix<}@
+ @\removedConcepts{set<Key, Compare, Alloc> >}@
+ @\removedConcepts{: true_type \{ \};}@
 }
 \end{codeblock}%
 \index{set@\tcode{set}!\tcode{operator==}}%
@@ -5759,7 +5773,7 @@
 
 \begin{itemdecl}
 explicit set(const Compare& comp = Compare(),
- const Allocator& = Allocator());
+ const Alloc@\removedConcepts{ator}@& = Alloc@\removedConcepts{ator}@());
 \end{itemdecl}
 
 \begin{itemdescr}
@@ -5776,7 +5790,7 @@
 template <@\changedConcepts{class InputIterator}{InputIterator Iter}@>
   @\addedConcepts{requires HasConstructor<value_type, Iter::reference>}@
   set(@\changedConcepts{InputIterator}{Iter}@ @\farg{first}@, @\changedConcepts{InputIterator}{Iter}@ @\farg{last}@,
- const Compare& @\farg{comp}@ = Compare(), const Allocator& = Allocator());
+ const Compare& @\farg{comp}@ = Compare(), const Alloc@\removedConcepts{ator}@& = Alloc@\removedConcepts{ator}@());
 \end{itemdecl}
 
 \begin{itemdescr}
@@ -5806,15 +5820,15 @@
 \rSec3[set.special]{\tcode{set}\ specialized algorithms}
 
 \begin{itemdecl}
-template <@\changedConcepts{class}{ObjectType}@ Key, class Compare, class Allocator>
- void swap(set<Key,Compare,Allocator>& x,
- set<Key,Compare,Allocator>& y);
-template <@\changedConcepts{class}{ObjectType}@ Key, class Compare, class Allocator>
- void swap(set<Key,Compare,Allocator>&& x,
- set<Key,Compare,Allocator>& y);
-template <@\changedConcepts{class}{ObjectType}@ Key, class Compare, class Allocator>
- void swap(set<Key,Compare,Allocator>& x,
- set<Key,Compare,Allocator>&& y);
+template <@\changedConcepts{class}{ObjectType}@ Key, class Compare, class Alloc@\removedConcepts{ator}@>
+ void swap(set<Key,Compare,Alloc@\removedConcepts{ator}@>& x,
+ set<Key,Compare,Alloc@\removedConcepts{ator}@>& y);
+template <@\changedConcepts{class}{ObjectType}@ Key, class Compare, class Alloc@\removedConcepts{ator}@>
+ void swap(set<Key,Compare,Alloc@\removedConcepts{ator}@>&& x,
+ set<Key,Compare,Alloc@\removedConcepts{ator}@>& y);
+template <@\changedConcepts{class}{ObjectType}@ Key, class Compare, class Alloc@\removedConcepts{ator}@>
+ void swap(set<Key,Compare,Alloc@\removedConcepts{ator}@>& x,
+ set<Key,Compare,Alloc@\removedConcepts{ator}@>&& y);
 \end{itemdecl}
 
 \begin{itemdescr}
@@ -5872,8 +5886,10 @@
 \begin{codeblock}
 namespace std {
   template <@\changedConcepts{class}{ObjectType}@ Key, @\changedConcepts{class}{Predicate<auto, Key, Key>}@ Compare = less<Key>,
- class Allocator = allocator<Key> >
+ @\changedConcepts{class}{Allocator}@ Alloc@\removedConcepts{ator}@ = allocator<Key> >
   @\addedConcepts{requires Destructible<Key> \&\& CopyConstructible<Compare>}@
+ @\addedConcepts{\&\& ConstructibleAsElement<Alloc, Compare, const Compare\&>}@
+ @\addedConcepts{\&\& ConstructibleAsElement<Alloc, Compare, Compare\&\&>}@
   class multiset {
   public:
     // types:
@@ -5881,35 +5897,35 @@
     typedef Key value_type;
     typedef Compare key_compare;
     typedef Compare value_compare;
- typedef Allocator allocator_type;
- typedef typename Allocator::reference reference;
- typedef typename Allocator::const_reference const_reference;
+ typedef Alloc@\removedConcepts{ator}@ allocator_type;
+ typedef typename Alloc@\removedConcepts{ator}@::reference reference;
+ typedef typename Alloc@\removedConcepts{ator}@::const_reference const_reference;
     typedef @\impdef@ iterator; // See \ref{container.requirements}
     typedef @\impdef@ const_iterator; // See \ref{container.requirements}
     typedef @\impdef@ size_type; // See \ref{container.requirements}
     typedef @\impdef@ difference_type;// See \ref{container.requirements}
- typedef typename Allocator::pointer pointer;
- typedef typename Allocator::const_pointer const_pointer;
+ typedef typename Alloc@\removedConcepts{ator}@::pointer pointer;
+ typedef typename Alloc@\removedConcepts{ator}@::const_pointer const_pointer;
     typedef std::reverse_iterator<iterator> reverse_iterator;
     typedef std::reverse_iterator<const_iterator> const_reverse_iterator;
 
     // construct/copy/destroy:
     explicit multiset(const Compare& comp = Compare(),
- const Allocator& = Allocator());
+ const Alloc@\removedConcepts{ator}@& = Alloc@\removedConcepts{ator}@());
     template <@\changedConcepts{class InputIterator}{InputIterator Iter}@>
       @\addedConcepts{requires HasConstructor<value_type, Iter::reference>}@
       multiset(@\changedConcepts{InputIterator}{Iter}@ first, @\changedConcepts{InputIterator}{Iter}@ last,
                const Compare& comp = Compare(),
- const Allocator& = Allocator());
- @\addedConcepts{requires CopyConstructible<value_type>}@ multiset(const multiset<Key,Compare,Allocator>& x);
- multiset(multiset<Key,Compare,Allocator>&& x);
- multiset(const Allocator&);
- @\addedConcepts{requires CopyConstructible<value_type>}@ multiset(const multiset&, const Allocator&);
- multiset(multiset&&, const Allocator&);
+ const Alloc@\removedConcepts{ator}@& = Alloc@\removedConcepts{ator}@());
+ @\addedConcepts{requires ConstructibleAsElement<Alloc, value_type, const value_type\&>}@ multiset(const multiset<Key,Compare,Alloc@\removedConcepts{ator}@>& x);
+ multiset(multiset<Key,Compare,Alloc@\removedConcepts{ator}@>&& x);
+ multiset(const Alloc@\removedConcepts{ator}@&);
+ @\addedConcepts{requires ConstructibleAsElement<Alloc, value_type, const value_type\&>}@ multiset(const multiset&, const Alloc@\removedConcepts{ator}@&);
+ multiset(multiset&&, const Alloc@\removedConcepts{ator}@&);
    ~multiset();
- @\addedConcepts{requires CopyConstructible<value_type> \&\& CopyAssignable<value_type>}@
- multiset<Key,Compare,Allocator>& operator=(const multiset<Key,Compare,Allocator>& x);
- multiset<Key,Compare,Allocator>& operator=(multiset<Key,Compare,Allocator>&& x);
+ @\addedConcepts{requires ConstructibleAsElement<Alloc, value_type, const value_type\&> \&\& CopyAssignable<value_type>}@
+ multiset<Key,Compare,Alloc@\removedConcepts{ator}@>& operator=(const multiset<Key,Compare,Alloc@\removedConcepts{ator}@>& x);
+ multiset<Key,Compare,Alloc@\removedConcepts{ator}@>& operator=(multiset<Key,Compare,Alloc@\removedConcepts{ator}@>&& x);
     allocator_type get_allocator() const;
 
     // iterators:
@@ -5940,10 +5956,10 @@
     template <class... Args>
       @\addedConcepts{requires HasConstructor<value_type, Args\&\&...>}@
       iterator emplace(const_iterator position, Args&&... args);
- @\addedConcepts{requires CopyConstructible<value_type>}@ iterator insert(const value_type& x);
- @\addedConcepts{requires MoveConstructible<value_type>}@ iterator insert(value_type&& x);
- @\addedConcepts{requires CopyConstructible<value_type>}@ iterator insert(const_iterator position, const value_type& x);
- @\addedConcepts{requires MoveConstructible<value_type>}@ iterator insert(const_iterator position, value_type&& x);
+ @\addedConcepts{requires ConstructibleAsElement<Alloc, value_type, const value_type\&>}@ iterator insert(const value_type& x);
+ @\addedConcepts{requires ConstructibleAsElement<Alloc, value_type, value_type\&\&>}@ iterator insert(value_type&& x);
+ @\addedConcepts{requires ConstructibleAsElement<Alloc, value_type, const value_type\&>}@ iterator insert(const_iterator position, const value_type& x);
+ @\addedConcepts{requires ConstructibleAsElement<Alloc, value_type, value_type\&\&>}@ iterator insert(const_iterator position, value_type&& x);
     template <@\changedConcepts{class InputIterator}{InputIterator Iter}@>
       @\addedConcepts{requires HasConstructor<value_type, Iter::reference>}@
       void insert(@\changedConcepts{InputIterator}{Iter}@ first, @\changedConcepts{InputIterator}{Iter}@ last);
@@ -5951,7 +5967,7 @@
     iterator erase(const_iterator position);
     size_type erase(const key_type& x);
     iterator erase(const_iterator first, const_iterator last);
- void swap(multiset<Key,Compare,Allocator>&&);
+ void swap(multiset<Key,Compare,Alloc@\removedConcepts{ator}@>&&);
     void clear();
 
     // observers:
@@ -5974,40 +5990,40 @@
     pair<const_iterator,const_iterator> equal_range(const key_type& x) const;
   };
 
- template <@\changedConcepts{class}{EqualityComparable}@ Key, class Compare, class Allocator>
- bool operator==(const multiset<Key,Compare,Allocator>& x,
- const multiset<Key,Compare,Allocator>& y);
- template <@\changedConcepts{class}{LessThanComparable}@ Key, class Compare, class Allocator>
- bool operator< (const multiset<Key,Compare,Allocator>& x,
- const multiset<Key,Compare,Allocator>& y);
- template <@\changedConcepts{class}{EqualityComparable}@ Key, class Compare, class Allocator>
- bool operator!=(const multiset<Key,Compare,Allocator>& x,
- const multiset<Key,Compare,Allocator>& y);
- template <@\changedConcepts{class}{LessThanComparable}@ Key, class Compare, class Allocator>
- bool operator> (const multiset<Key,Compare,Allocator>& x,
- const multiset<Key,Compare,Allocator>& y);
- template <@\changedConcepts{class}{LessThanComparable}@ Key, class Compare, class Allocator>
- bool operator>=(const multiset<Key,Compare,Allocator>& x,
- const multiset<Key,Compare,Allocator>& y);
- template <@\changedConcepts{class}{LessThanComparable}@ Key, class Compare, class Allocator>
- bool operator<=(const multiset<Key,Compare,Allocator>& x,
- const multiset<Key,Compare,Allocator>& y);
+ template <@\changedConcepts{class}{EqualityComparable}@ Key, class Compare, class Alloc@\removedConcepts{ator}@>
+ bool operator==(const multiset<Key,Compare,Alloc@\removedConcepts{ator}@>& x,
+ const multiset<Key,Compare,Alloc@\removedConcepts{ator}@>& y);
+ template <@\changedConcepts{class}{LessThanComparable}@ Key, class Compare, class Alloc@\removedConcepts{ator}@>
+ bool operator< (const multiset<Key,Compare,Alloc@\removedConcepts{ator}@>& x,
+ const multiset<Key,Compare,Alloc@\removedConcepts{ator}@>& y);
+ template <@\changedConcepts{class}{EqualityComparable}@ Key, class Compare, class Alloc@\removedConcepts{ator}@>
+ bool operator!=(const multiset<Key,Compare,Alloc@\removedConcepts{ator}@>& x,
+ const multiset<Key,Compare,Alloc@\removedConcepts{ator}@>& y);
+ template <@\changedConcepts{class}{LessThanComparable}@ Key, class Compare, class Alloc@\removedConcepts{ator}@>
+ bool operator> (const multiset<Key,Compare,Alloc@\removedConcepts{ator}@>& x,
+ const multiset<Key,Compare,Alloc@\removedConcepts{ator}@>& y);
+ template <@\changedConcepts{class}{LessThanComparable}@ Key, class Compare, class Alloc@\removedConcepts{ator}@>
+ bool operator>=(const multiset<Key,Compare,Alloc@\removedConcepts{ator}@>& x,
+ const multiset<Key,Compare,Alloc@\removedConcepts{ator}@>& y);
+ template <@\changedConcepts{class}{LessThanComparable}@ Key, class Compare, class Alloc@\removedConcepts{ator}@>
+ bool operator<=(const multiset<Key,Compare,Alloc@\removedConcepts{ator}@>& x,
+ const multiset<Key,Compare,Alloc@\removedConcepts{ator}@>& y);
 
   // specialized algorithms:
- template <@\changedConcepts{class}{ObjectType}@ Key, class Compare, class Allocator>
- void swap(multiset<Key,Compare,Allocator>& x,
- multiset<Key,Compare,Allocator>& y);
- template <@\changedConcepts{class}{ObjectType}@ Key, class Compare, class Allocator>
- void swap(multiset<Key,Compare,Allocator&& x,
- multiset<Key,Compare,Allocator>& y);
- template <@\changedConcepts{class}{ObjectType}@ Key, class Compare, class Allocator>
- void swap(multiset<Key,Compare,Allocator& x,
- multiset<Key,Compare,Allocator>&& y);
-
- template <class Key, class Compare, class Alloc>
- struct constructible_with_allocator_suffix<
- multiset<Key, Compare, Alloc> >
- : true_type { };
+ template <@\changedConcepts{class}{ObjectType}@ Key, class Compare, class Alloc@\removedConcepts{ator}@>
+ void swap(multiset<Key,Compare,Alloc@\removedConcepts{ator}@>& x,
+ multiset<Key,Compare,Alloc@\removedConcepts{ator}@>& y);
+ template <@\changedConcepts{class}{ObjectType}@ Key, class Compare, class Alloc@\removedConcepts{ator}@>
+ void swap(multiset<Key,Compare,Alloc@\removedConcepts{ator}@&& x,
+ multiset<Key,Compare,Alloc@\removedConcepts{ator}@>& y);
+ template <@\changedConcepts{class}{ObjectType}@ Key, class Compare, class Alloc@\removedConcepts{ator}@>
+ void swap(multiset<Key,Compare,Alloc@\removedConcepts{ator}@& x,
+ multiset<Key,Compare,Alloc@\removedConcepts{ator}@>&& y);
+
+ @\removedConcepts{template <class Key, class Compare, class Alloc>}@
+ @\removedConcepts{struct constructible_with_allocator_suffix<}@
+ @\removedConcepts{multiset<Key, Compare, Alloc> >}@
+ @\removedConcepts{: true_type \{ \};}@
 }
 \end{codeblock}%
 \index{multiset@\tcode{multiset}!\tcode{operator==}}%
@@ -6017,7 +6033,7 @@
 
 \begin{itemdecl}
 explicit multiset(const Compare& @\farg{comp}@ = Compare(),
- const Allocator& = Allocator());
+ const Alloc@\removedConcepts{ator}@& = Alloc@\removedConcepts{ator}@());
 \end{itemdecl}
 
 \begin{itemdescr}
@@ -6035,7 +6051,7 @@
   @\addedConcepts{requires HasConstructor<value_type, Iter::reference>}@
   multiset(@\changedConcepts{InputIterator}{Iter}@ @\farg{first}@, @\changedConcepts{InputIterator}{Iter}@ @\farg{last}@,
            const Compare& @\farg{comp}@ = Compare(),
- const Allocator& = Allocator());
+ const Alloc@\removedConcepts{ator}@& = Alloc@\removedConcepts{ator}@());
 \end{itemdecl}
 
 \begin{itemdescr}
@@ -6065,15 +6081,15 @@
 \rSec3[multiset.special]{\tcode{multiset}\ specialized algorithms}
 
 \begin{itemdecl}
-template <@\changedConcepts{class}{ObjectType}@ Key, class Compare, class Allocator>
- void swap(multiset<Key,Compare,Allocator>& x,
- multiset<Key,Compare,Allocator>& y);
-template <@\changedConcepts{class}{ObjectType}@ Key, class Compare, class Allocator>
- void swap(multiset<Key,Compare,Allocator>&& x,
- multiset<Key,Compare,Allocator>& y);
-template <@\changedConcepts{class}{ObjectType}@ Key, class Compare, class Allocator>
- void swap(multiset<Key,Compare,Allocator>& x,
- multiset<Key,Compare,Allocator>&& y);
+template <@\changedConcepts{class}{ObjectType}@ Key, class Compare, class Alloc@\removedConcepts{ator}@>
+ void swap(multiset<Key,Compare,Alloc@\removedConcepts{ator}@>& x,
+ multiset<Key,Compare,Alloc@\removedConcepts{ator}@>& y);
+template <@\changedConcepts{class}{ObjectType}@ Key, class Compare, class Alloc@\removedConcepts{ator}@>
+ void swap(multiset<Key,Compare,Alloc@\removedConcepts{ator}@>&& x,
+ multiset<Key,Compare,Alloc@\removedConcepts{ator}@>& y);
+template <@\changedConcepts{class}{ObjectType}@ Key, class Compare, class Alloc@\removedConcepts{ator}@>
+ void swap(multiset<Key,Compare,Alloc@\removedConcepts{ator}@>& x,
+ multiset<Key,Compare,Alloc@\removedConcepts{ator}@>&& y);
 \end{itemdecl}
 
 \begin{itemdescr}
@@ -6100,9 +6116,13 @@
             @\changedConcepts{class}{ObjectType}@ T,
             @\changedConcepts{class}{Callable<auto, Key>}@ Hash = hash<Key>,
             @\changedConcepts{class}{Predicate<auto, Key, Key>}@ Pred = std::equal_to<Key>,
- class Alloc = std::allocator<std::pair<const Key, T> > >
+ @\changedConcepts{class}{Allocator}@ Alloc = std::allocator<std::pair<const Key, T> > >
     @\addedConcepts{requires SameType<Hash::result_type, std::size_t>}@
              @\addedConcepts{\&\& CopyConstructible<Hash> \&\& CopyConstructible<Pred>}@
+ @\addedConcepts{\&\& ConstructibleAsElement<Alloc, Pred, const Pred\&>}@
+ @\addedConcepts{\&\& ConstructibleAsElement<Alloc, Pred, Pred\&\&>}@
+ @\addedConcepts{\&\& ConstructibleAsElement<Alloc, Hash, const Hash\&>}@
+ @\addedConcepts{\&\& ConstructibleAsElement<Alloc, Hash, Hash\&\&>}@
     class unordered_map;
 
   // \ref{unord.multimap}, class template unordered_multimap:
@@ -6110,9 +6130,13 @@
             @\changedConcepts{class}{ObjectType}@ T,
             @\changedConcepts{class}{Callable<auto, Key>}@ Hash = hash<Key>,
             @\changedConcepts{class}{Predicate<auto, Key, Key>}@ Pred = std::equal_to<Key>,
- class Alloc = std::allocator<std::pair<const Key, T> > >
+ @\changedConcepts{class}{Allocator}@ Alloc = std::allocator<std::pair<const Key, T> > >
     @\addedConcepts{requires SameType<Hash::result_type, std::size_t>}@
              @\addedConcepts{\&\& CopyConstructible<Hash> \&\& CopyConstructible<Pred>}@
+ @\addedConcepts{\&\& ConstructibleAsElement<Alloc, Pred, const Pred\&>}@
+ @\addedConcepts{\&\& ConstructibleAsElement<Alloc, Pred, Pred\&\&>}@
+ @\addedConcepts{\&\& ConstructibleAsElement<Alloc, Hash, const Hash\&>}@
+ @\addedConcepts{\&\& ConstructibleAsElement<Alloc, Hash, Hash\&\&>}@
     class unordered_multimap;
 
   template <@\changedConcepts{class}{ObjectType}@ Key, @\changedConcepts{class}{ObjectType}@ T, class Hash, class Pred, class Alloc>
@@ -6135,18 +6159,26 @@
   template <@\changedConcepts{class}{ObjectType}@ Value,
             @\changedConcepts{class}{Callable<auto, Value>}@ Hash = hash<Value>,
             @\changedConcepts{class}{Predicate<auto, Value, Value>}@ class Pred = std::equal_to<Value>,
- class Alloc = std::allocator<Value> >
+ @\changedConcepts{class}{Allocator}@ Alloc = std::allocator<Value> >
     @\addedConcepts{requires SameType<Hash::result_type, std::size_t>}@
              @\addedConcepts{\&\& CopyConstructible<Hash> \&\& CopyConstructible<Pred>}@
+ @\addedConcepts{\&\& ConstructibleAsElement<Alloc, Pred, const Pred\&>}@
+ @\addedConcepts{\&\& ConstructibleAsElement<Alloc, Pred, Pred\&\&>}@
+ @\addedConcepts{\&\& ConstructibleAsElement<Alloc, Hash, const Hash\&>}@
+ @\addedConcepts{\&\& ConstructibleAsElement<Alloc, Hash, Hash\&\&>}@
     class unordered_set;
 
   // \ref{unord.multiset}, class template unordered_multiset:
   template <@\changedConcepts{class}{ObjectType}@ Value,
             @\changedConcepts{class}{Callable<auto, Value>}@ Hash = hash<Value>,
             @\changedConcepts{class}{Predicate<auto, Value, Value>}@ class Pred = std::equal_to<Value>,
- class Alloc = std::allocator<Value> >
+ @\changedConcepts{class}{Allocator}@ Alloc = std::allocator<Value> >
     @\addedConcepts{requires SameType<Hash::result_type, std::size_t>}@
              @\addedConcepts{\&\& CopyConstructible<Hash> \&\& CopyConstructible<Pred>}@
+ @\addedConcepts{\&\& ConstructibleAsElement<Alloc, Pred, const Pred\&>}@
+ @\addedConcepts{\&\& ConstructibleAsElement<Alloc, Pred, Pred\&\&>}@
+ @\addedConcepts{\&\& ConstructibleAsElement<Alloc, Hash, const Hash\&>}@
+ @\addedConcepts{\&\& ConstructibleAsElement<Alloc, Hash, Hash\&\&>}@
     class unordered_multiset;
 
   template <@\changedConcepts{class}{ObjectType}@ Value, class Hash, class Pred, class Alloc>
@@ -6186,9 +6218,13 @@
             @\changedConcepts{class}{ObjectType}@ T,
             @\changedConcepts{class}{Callable<auto, Key>}@ Hash = hash<Key>,
             @\changedConcepts{class}{Predicate<auto, Key, Key>}@ Pred = std::equal_to<Key>,
- class Alloc = std::allocator<std::pair<const Key, T> > >
+ @\changedConcepts{class}{Allocator}@ Alloc = std::allocator<std::pair<const Key, T> > >
   @\addedConcepts{requires SameType<Hash::result_type, std::size_t>}@
            @\addedConcepts{\&\& CopyConstructible<Hash> \&\& CopyConstructible<Pred>}@
+ @\addedConcepts{\&\& ConstructibleAsElement<Alloc, Pred, const Pred\&>}@
+ @\addedConcepts{\&\& ConstructibleAsElement<Alloc, Pred, Pred\&\&>}@
+ @\addedConcepts{\&\& ConstructibleAsElement<Alloc, Hash, const Hash\&>}@
+ @\addedConcepts{\&\& ConstructibleAsElement<Alloc, Hash, Hash\&\&>}@
   class unordered_map
   {
   public:
@@ -6223,12 +6259,12 @@
                     const hasher& hf = hasher(),
                     const key_equal& eql = key_equal(),
                     const allocator_type& a = allocator_type());
- @\addedConcepts{requires CopyConstructible<value_type>}@ unordered_map(const unordered_map&);
- unordered_map(const Allocator&);
- @\addedConcepts{requires CopyConstructible<value_type>}@ unordered_map(const unordered_map&, const Allocator&);
- unordered_map(unordered_map&&, const Allocator&);
+ @\addedConcepts{requires ConstructibleAsElement<Alloc, value_type, const value_type\&>}@ unordered_map(const unordered_map&);
+ unordered_map(const Alloc@\removedConcepts{ator}@&);
+ @\addedConcepts{requires ConstructibleAsElement<Alloc, value_type, const value_type\&>}@ unordered_map(const unordered_map&, const Alloc@\removedConcepts{ator}@&);
+ unordered_map(unordered_map&&, const Alloc@\removedConcepts{ator}@&);
     ~unordered_map();
- @\addedConcepts{requires CopyConstructible<value_type> \&\& CopyAssignable<value_type>}@
+ @\addedConcepts{requires ConstructibleAsElement<Alloc, value_type, const value_type\&> \&\& CopyAssignable<value_type>}@
       unordered_map& operator=(const unordered_map&);
     allocator_type get_allocator() const;
 
@@ -6252,9 +6288,9 @@
     template <class... Args>
       @\addedConcepts{requires HasConstructor<value_type, Args\&\&...>}@
       iterator emplace(const_iterator position, Args&&... args);
- @\addedConcepts{requires CopyConstructible<value_type>}@
+ @\addedConcepts{requires ConstructibleAsElement<Alloc, value_type, const value_type\&>}@
       std::pair<iterator, bool> insert(const value_type& obj);
- @\addedConcepts{requires CopyConstructible<value_type>}@
+ @\addedConcepts{requires ConstructibleAsElement<Alloc, value_type, const value_type\&>}@
       iterator insert(const_iterator hint, const value_type& obj);
     template <@\changedConcepts{class InputIterator}{InputIterator Iter}@>
       @\addedConcepts{requires HasConstructor<value_type, Iter::reference>}@
@@ -6278,7 +6314,7 @@
     std::pair<iterator, iterator> equal_range(const key_type& k);
     std::pair<const_iterator, const_iterator> equal_range(const key_type& k) const;
 
- @\addedConcepts{requires DefaultConstructible<T> \&\& CopyConstructible<key_type>}@ mapped_type& operator[](const key_type& k);
+ @\addedConcepts{requires DefaultConstructible<T> \&\& CopyConstructible<Key>}@ mapped_type& operator[](const key_type& k);
 
     // bucket interface
     size_type bucket_count() const;
@@ -6294,17 +6330,17 @@
     float load_factor() const;
     float max_load_factor() const;
     void max_load_factor(float z);
- @\addedConcepts{requires MoveConstructible<value_type>}@ void rehash(size_type n);
+ @\addedConcepts{requires ConstructibleAsElement<Alloc, value_type, value_type\&\&>}@ void rehash(size_type n);
   };
 
   template <@\changedConcepts{class}{ObjectType}@ Key, @\changedConcepts{class}{ObjectType}@ T, class Hash, class Pred, class Alloc>
     void swap(unordered_map<Key, T, Hash, Pred, Alloc>& x,
               unordered_map<Key, T, Hash, Pred, Alloc>& y);
 
- template <class Key, class T, class Hash, class Pred, class Alloc>
- struct constructible_with_allocator_suffix<
- unordered_map<Key, T, Hash, Pred, Compare, Alloc> >
- : true_type { };
+ @\removedConcepts{template <class Key, class T, class Hash, class Pred, class Alloc>}@
+ @\removedConcepts{struct constructible_with_allocator_suffix<}@
+ @\removedConcepts{unordered_map<Key, T, Hash, Pred, Compare, Alloc> >}@
+ @\removedConcepts{: true_type \{ \};}@
 }
 \end{codeblock}
 
@@ -6360,7 +6396,7 @@
 \index{operator[]@\tcode{operator[]}!unordered_map@\tcode{unordered_map}}%
 \index{unordered_map@\tcode{unordered_map}!element access}%
 \begin{itemdecl}
-@\addedConcepts{requires DefaultConstructible<T> \&\& CopyConstructible<key_type>}@ mapped_type& operator[](const key_type& k);
+@\addedConcepts{requires DefaultConstructible<T> \&\& CopyConstructible<Key>}@ mapped_type& operator[](const key_type& k);
 \end{itemdecl}
 
 \begin{itemdescr}
@@ -6416,9 +6452,13 @@
             @\changedConcepts{class}{ObjectType}@ T,
             @\changedConcepts{class}{Callable<auto, Key>}@ Hash = hash<Key>,
             @\changedConcepts{class}{Predicate<auto, Key, Key>}@ Pred = std::equal_to<Key>,
- class Alloc = std::allocator<std::pair<const Key, T> > >
+ @\changedConcepts{class}{Allocator}@ Alloc = std::allocator<std::pair<const Key, T> > >
   @\addedConcepts{requires SameType<Hash::result_type, std::size_t>}@
            @\addedConcepts{\&\& CopyConstructible<Hash> \&\& CopyConstructible<Pred>}@
+ @\addedConcepts{\&\& ConstructibleAsElement<Alloc, Pred, const Pred\&>}@
+ @\addedConcepts{\&\& ConstructibleAsElement<Alloc, Pred, Pred\&\&>}@
+ @\addedConcepts{\&\& ConstructibleAsElement<Alloc, Hash, const Hash\&>}@
+ @\addedConcepts{\&\& ConstructibleAsElement<Alloc, Hash, Hash\&\&>}@
   class unordered_multimap
   {
   public:
@@ -6453,13 +6493,13 @@
                          const hasher& hf = hasher(),
                          const key_equal& eql = key_equal(),
                          const allocator_type& a = allocator_type());
- @\addedConcepts{requires CopyConstructible<value_type>}@ unordered_multimap(const unordered_multimap&);
- unordered_multimap(const Allocator&);
- @\addedConcepts{requires CopyConstructible<value_type>}@
- unordered_multimap(const unordered_multimap&, const Allocator&);
- unordered_multimap(unordered_multimap&&, const Allocator&);
+ @\addedConcepts{requires ConstructibleAsElement<Alloc, value_type, const value_type\&>}@ unordered_multimap(const unordered_multimap&);
+ unordered_multimap(const Alloc@\removedConcepts{ator}@&);
+ @\addedConcepts{requires ConstructibleAsElement<Alloc, value_type, const value_type\&>}@
+ unordered_multimap(const unordered_multimap&, const Alloc@\removedConcepts{ator}@&);
+ unordered_multimap(unordered_multimap&&, const Alloc@\removedConcepts{ator}@&);
     ~unordered_multimap();
- @\addedConcepts{requires CopyConstructible<value_type> \&\& CopyAssignable<value_type>}@
+ @\addedConcepts{requires ConstructibleAsElement<Alloc, value_type, const value_type\&> \&\& CopyAssignable<value_type>}@
       unordered_multimap& operator=(const unordered_multimap&);
     allocator_type get_allocator() const;
 
@@ -6483,8 +6523,8 @@
     template <class... Args>
       @\addedConcepts{requires HasConstructor<value_type, Args\&\&...>}@
       iterator emplace(const_iterator position, Args&&... args);
- @\addedConcepts{requires CopyConstructible<value_type>}@ iterator insert(const value_type& obj);
- @\addedConcepts{requires CopyConstructible<value_type>}@
+ @\addedConcepts{requires ConstructibleAsElement<Alloc, value_type, const value_type\&>}@ iterator insert(const value_type& obj);
+ @\addedConcepts{requires ConstructibleAsElement<Alloc, value_type, const value_type\&>}@
       iterator insert(const_iterator hint, const value_type& obj);
     template <@\changedConcepts{class InputIterator}{InputIterator Iter}@>
       void insert(@\changedConcepts{InputIterator}{Iter}@ first, @\changedConcepts{InputIterator}{Iter}@ last);
@@ -6521,17 +6561,17 @@
     float load_factor() const;
     float max_load_factor() const;
     void max_load_factor(float z);
- @\addedConcepts{requires MoveConstructible<value_type>}@ void rehash(size_type n);
+ @\addedConcepts{requires ConstructibleAsElement<Alloc, value_type, value_type\&\&>}@ void rehash(size_type n);
   };
 
   template <@\changedConcepts{class}{ObjectType}@ Key, @\changedConcepts{class}{ObjectType}@ T, class Hash, class Pred, class Alloc>
     void swap(unordered_multimap<Key, T, Hash, Pred, Alloc>& x,
               unordered_multimap<Key, T, Hash, Pred, Alloc>& y);
 
- template <class Key, class T, class Hash, class Pred, class Alloc>
- struct constructible_with_allocator_suffix<
- unordered_multimap<Key, T, Hash, Pred, Alloc> >
- : true_type { };
+ @\removedConcepts{template <class Key, class T, class Hash, class Pred, class Alloc>}@
+ @\removedConcepts{struct constructible_with_allocator_suffix<}@
+ @\removedConcepts{unordered_multimap<Key, T, Hash, Pred, Alloc> >}@
+ @\removedConcepts{: true_type \{ \};}@
 }
 \end{codeblock}
 
@@ -6622,9 +6662,13 @@
   template <@\changedConcepts{class}{ObjectType}@ Value,
             @\changedConcepts{class}{Callable<auto, Value>}@ Hash = hash<Value>,
             @\changedConcepts{class}{Predicate<auto, Value, Value>}@ class Pred = std::equal_to<Value>,
- class Alloc = std::allocator<Value> >
+ @\changedConcepts{class}{Allocator}@ Alloc = std::allocator<Value> >
   @\addedConcepts{requires SameType<Hash::result_type, std::size_t>}@
            @\addedConcepts{\&\& CopyConstructible<Hash> \&\& CopyConstructible<Pred>}@
+ @\addedConcepts{\&\& ConstructibleAsElement<Alloc, Pred, const Pred\&>}@
+ @\addedConcepts{\&\& ConstructibleAsElement<Alloc, Pred, Pred\&\&>}@
+ @\addedConcepts{\&\& ConstructibleAsElement<Alloc, Hash, const Hash\&>}@
+ @\addedConcepts{\&\& ConstructibleAsElement<Alloc, Hash, Hash\&\&>}@
   class unordered_set
   {
   public:
@@ -6658,12 +6702,12 @@
                     const hasher& hf = hasher(),
                     const key_equal& eql = key_equal(),
                     const allocator_type& a = allocator_type());
- @\addedConcepts{requires CopyConstructible<value_type>}@ unordered_set(const unordered_set&);
- unordered_set(const Allocator&);
- @\addedConcepts{requires CopyConstructible<value_type>}@ unordered_set(const unordered_set&, const Allocator&);
- unordered_set(unordered_set&&, const Allocator&);
+ @\addedConcepts{requires ConstructibleAsElement<Alloc, value_type, const value_type\&>}@ unordered_set(const unordered_set&);
+ unordered_set(const Alloc@\removedConcepts{ator}@&);
+ @\addedConcepts{requires ConstructibleAsElement<Alloc, value_type, const value_type\&>}@ unordered_set(const unordered_set&, const Alloc@\removedConcepts{ator}@&);
+ unordered_set(unordered_set&&, const Alloc@\removedConcepts{ator}@&);
     ~unordered_set();
- @\addedConcepts{requires CopyConstructible<value_type> \&\& CopyAssignable<value_type>}@
+ @\addedConcepts{requires ConstructibleAsElement<Alloc, value_type, const value_type\&> \&\& CopyAssignable<value_type>}@
       unordered_set& operator=(const unordered_set&);
     allocator_type get_allocator() const;
 
@@ -6687,8 +6731,8 @@
     template <class... Args>
       @\addedConcepts{requires HasConstructor<value_type, Args\&\&...>}@
       iterator emplace(const_iterator position, Args&&... args);
- @\addedConcepts{requires CopyConstructible<value_type>}@ std::pair<iterator, bool> insert(const value_type& obj);
- @\addedConcepts{requires CopyConstructible<value_type>}@
+ @\addedConcepts{requires ConstructibleAsElement<Alloc, value_type, const value_type\&>}@ std::pair<iterator, bool> insert(const value_type& obj);
+ @\addedConcepts{requires ConstructibleAsElement<Alloc, value_type, const value_type\&>}@
       iterator insert(const_iterator hint, const value_type& obj);
     template <@\changedConcepts{class InputIterator}{InputIterator Iter}@>
       @\addedConcepts{requires HasConstructor<value_type, Iter::reference>}@
@@ -6726,17 +6770,17 @@
     float load_factor() const;
     float max_load_factor() const;
     void max_load_factor(float z);
- @\addedConcepts{requires MoveConstructible<value_type>}@ void rehash(size_type n);
+ @\addedConcepts{requires ConstructibleAsElement<Alloc, value_type, value_type\&\&>}@ void rehash(size_type n);
   };
 
   template <@\changedConcepts{class}{ObjectType}@ Value, class Hash, class Pred, class Alloc>
     void swap(unordered_set<Value, Hash, Pred, Alloc>& x,
               unordered_set<Value, Hash, Pred, Alloc>& y);
 
- template <class Value, class Hash, class Pred, class Alloc>
- struct constructible_with_allocator_suffix<
- map<Value, Hash, Pred, Alloc> >
- : true_type { };
+ @\removedConcepts{template <class Value, class Hash, class Pred, class Alloc>}@
+ @\removedConcepts{struct constructible_with_allocator_suffix<}@
+ @\removedConcepts{map<Value, Hash, Pred, Alloc> >}@
+ @\removedConcepts{: true_type \{ \};}@
 }
 \end{codeblock}
 
@@ -6826,9 +6870,13 @@
   template <@\changedConcepts{class}{ObjectType}@ Value,
             @\changedConcepts{class}{Callable<auto, Value>}@ Hash = hash<Value>,
             @\changedConcepts{class}{Predicate<auto, Value, Value>}@ class Pred = std::equal_to<Value>,
- class Alloc = std::allocator<Value> >
+ @\changedConcepts{class}{Allocator}@ Alloc = std::allocator<Value> >
   @\addedConcepts{requires SameType<Hash::result_type, std::size_t>}@
            @\addedConcepts{\&\& CopyConstructible<Hash> \&\& CopyConstructible<Pred>}@
+ @\addedConcepts{\&\& ConstructibleAsElement<Alloc, Pred, const Pred\&>}@
+ @\addedConcepts{\&\& ConstructibleAsElement<Alloc, Pred, Pred\&\&>}@
+ @\addedConcepts{\&\& ConstructibleAsElement<Alloc, Hash, const Hash\&>}@
+ @\addedConcepts{\&\& ConstructibleAsElement<Alloc, Hash, Hash\&\&>}@
   class unordered_multiset
   {
   public:
@@ -6862,12 +6910,12 @@
                          const hasher& hf = hasher(),
                          const key_equal& eql = key_equal(),
                          const allocator_type& a = allocator_type());
- @\addedConcepts{requires CopyConstructible<value_type>}@ unordered_multiset(const unordered_multiset&);
- unordered_multiset(const Allocator&);
- @\addedConcepts{requires CopyConstructible<value_type>}@ unordered_multiset(const unordered_multiset&, const Allocator&);
- unordered_multiset(unordered_multiset&&, const Allocator&);
+ @\addedConcepts{requires ConstructibleAsElement<Alloc, value_type, const value_type\&>}@ unordered_multiset(const unordered_multiset&);
+ unordered_multiset(const Alloc@\removedConcepts{ator}@&);
+ @\addedConcepts{requires ConstructibleAsElement<Alloc, value_type, const value_type\&>}@ unordered_multiset(const unordered_multiset&, const Alloc@\removedConcepts{ator}@&);
+ unordered_multiset(unordered_multiset&&, const Alloc@\removedConcepts{ator}@&);
     ~unordered_multiset();
- @\addedConcepts{requires CopyConstructible<value_type> \&\& CopyAssignable<value_type>}@
+ @\addedConcepts{requires ConstructibleAsElement<Alloc, value_type, const value_type\&> \&\& CopyAssignable<value_type>}@
       unordered_multiset& operator=(const unordered_multiset&);
     allocator_type get_allocator() const;
 
@@ -6891,8 +6939,8 @@
     template <class... Args>
       @\addedConcepts{requires HasConstructor<value_type, Args\&\&...>}@
       iterator emplace(const_iterator position, Args&&... args);
- @\addedConcepts{requires CopyConstructible<value_type>}@ iterator insert(const value_type& obj);
- @\addedConcepts{requires CopyConstructible<value_type>}@
+ @\addedConcepts{requires ConstructibleAsElement<Alloc, value_type, const value_type\&>}@ iterator insert(const value_type& obj);
+ @\addedConcepts{requires ConstructibleAsElement<Alloc, value_type, const value_type\&>}@
       iterator insert(const_iterator hint, const value_type& obj);
     template <@\changedConcepts{class InputIterator}{InputIterator Iter}@>
       @\addedConcepts{requires HasConstructor<value_type, Iter::value_type>}@
@@ -6930,17 +6978,17 @@
     float load_factor() const;
     float max_load_factor() const;
     void max_load_factor(float z);
- @\addedConcepts{requires MoveConstructible<value_type>}@ void rehash(size_type n);
+ @\addedConcepts{requires ConstructibleAsElement<Alloc, value_type, value_type\&\&>}@ void rehash(size_type n);
   };
 
   template <@\changedConcepts{class}{ObjectType}@ Value, class Hash, class Pred, class Alloc>
     void swap(unordered_multiset<Value, Hash, Pred, Alloc>& x,
               unordered_multiset<Value, Hash, Pred, Alloc>& y);
 
- template <class Value, class Hash, class Pred, class Alloc>
- struct constructible_with_allocator_suffix<
- unordered_multiset<Value, Hash, Pred, Alloc> >
- : true_type { };
+ @\removedConcepts{template <class Value, class Hash, class Pred, class Alloc>}@
+ @\removedConcepts{struct constructible_with_allocator_suffix<}@
+ @\removedConcepts{unordered_multiset<Value, Hash, Pred, Alloc> >}@
+ @\removedConcepts{: true_type \{ \};}@
 }
 \end{codeblock}
 


Boost-Commit list run by bdawes at acm.org, david.abrahams at rcn.com, gregod at cs.rpi.edu, cpdaniel at pacbell.net, john at johnmaddock.co.uk