|
Boost-Commit : |
From: dgregor_at_[hidden]
Date: 2008-05-15 15:21:14
Author: dgregor
Date: 2008-05-15 15:21:13 EDT (Thu, 15 May 2008)
New Revision: 45402
URL: http://svn.boost.org/trac/boost/changeset/45402
Log:
Suggestions from Daniel Kruegler
Text files modified:
sandbox/committee/concepts/stdlib/clib-algorithms.tex | 50 ++++++++--------
sandbox/committee/concepts/stdlib/clib-concepts.tex | 120 +++++++++++++++++++++++++---------------
2 files changed, 100 insertions(+), 70 deletions(-)
Modified: sandbox/committee/concepts/stdlib/clib-algorithms.tex
==============================================================================
--- sandbox/committee/concepts/stdlib/clib-algorithms.tex (original)
+++ sandbox/committee/concepts/stdlib/clib-algorithms.tex 2008-05-15 15:21:13 EDT (Thu, 15 May 2008)
@@ -197,7 +197,7 @@
OutIter copy(InIter @\farg{first}@, InIter @\farg{last}@,
OutIter @\farg{result}@);
template<BidirectionalIterator InIter, MutableBidirectionalIterator OutIter>
- requires CopyAssignable<OutIter::reference, InIter::reference>
+ requires HasCopyAssign<OutIter::reference, InIter::reference>
OutIter copy_backward(InIter @\farg{first}@, InIter @\farg{last}@,
OutIter @\farg{result}@);
@@ -206,7 +206,7 @@
OutIter move(InIter @\farg{first}@, InIter @\farg{last}@,
OutIter @\farg{result}@);
template<BidirectionalIterator InIter, BidirectionalIterator OutIter>
- requires MoveAssignable<OutIter::reference, InIter::value_type>
+ requires HasMoveAssign<OutIter::reference, InIter::value_type>
OutIter move_backward(InIter @\farg{first}@, InIter @\farg{last}@,
OutIter @\farg{result}@);
@@ -241,34 +241,34 @@
BinaryOp @\farg{binary_op}@);
template<MutableForwardIterator Iter, class T>
- requires HasEqualTo<Iter::reference, T> && CopyAssignable<Iter::reference, T>
+ requires HasEqualTo<Iter::reference, T> && HasCopyAssign<Iter::reference, T>
void replace(Iter @\farg{first}@, Iter @\farg{last}@,
const T& @\farg{old_value}@, const T& @\farg{new_value}@);
@\textcolor{addclr}{template}@<MutableForwardIterator Iter, Predicate<auto, Iter::reference> Pred, class T>
- requires CopyAssignable<Iter::reference, T>
+ requires HasCopyAssign<Iter::reference, T>
void replace_if(Iter @\farg{first}@, Iter @\farg{last}@,
Pred @\farg{pred}@, const T& @\farg{new_value}@);
template<InputIterator InIter, OutputIterator<auto, InIter::value_type> OutIter, class T>
- requires CopyAssignable<OutIter::reference, T> && HasEqualTo<InIter::reference, T>
+ requires HasCopyAssign<OutIter::reference, T> && HasEqualTo<InIter::reference, T>
OutIter replace_copy(InIter @\farg{first}@, InIter @\farg{last}@,
OutIter @\farg{result}@,
const T& @\farg{old_value}@, const T& @\farg{new_value}@);
template<InputIterator InIter, OutputIterator<auto, InIter::value_type> OutIter,
Predicate<auto, InIter::reference> Pred, class T>
- requires CopyAssignable<OutIter::reference, T>
+ requires HasCopyAssign<OutIter::reference, T>
OutIter replace_copy_if(InIter @\farg{first}@, InIter @\farg{last}@,
OutIter @\farg{result}@,
Pred @\farg{pred}@, const T& @\farg{new_value}@);
template<MutableForwardIterator Iter, class T>
- requires CopyAssignable<Iter::reference, T>
+ requires HasCopyAssign<Iter::reference, T>
void fill(Iter @\farg{first}@, Iter @\farg{last}@, const T& @\farg{value}@);
template<class Iter, Integral Size, class T>
requires OutputIterator<Iter, T>
void fill_n(Iter @\farg{first}@, Size @\farg{n}@, const T& @\farg{value}@);
template<MutableForwardIterator Iter, Callable Generator>
- requires CopyAssignable<Iter::reference, Generator::result_type>
+ requires HasCopyAssign<Iter::reference, Generator::result_type>
void generate(Iter @\farg{first}@, Iter @\farg{last}@,
Generator @\farg{gen}@);
template<class Iter, Integral Size, Callable Generator>
@@ -312,7 +312,7 @@
OutIter @\farg{result}@);
template<InputIterator InIter, MutableForwardIterator OutIter>
requires HasEqualTo<OutIter::reference, InIter::value_type> &&
- CopyAssignable<OutIter::reference, InIter::reference> &&
+ HasCopyAssign<OutIter::reference, InIter::reference> &&
!ForwardIterator<InIter>
OutIter unique_copy(InIter @\farg{first}@, InIter @\farg{last}@,
OutIter @\farg{result}@);
@@ -328,7 +328,7 @@
OutIter @\farg{result}@);
template<InputIterator InIter, MutableForwardIterator OutIter,
Predicate<auto, OutIter::reference, InIter::reference> Pred>
- requires CopyAssignable<OutIter::reference, InIter::reference> &&
+ requires HasCopyAssign<OutIter::reference, InIter::reference> &&
!ForwardIterator<InIter>
OutIter unique_copy(InIter @\farg{first}@, InIter @\farg{last}@,
OutIter @\farg{result}@, Pred @\farg{pred}@);
@@ -425,7 +425,7 @@
Iter @\farg{last}@,
Compare @\farg{comp}@);
template<InputIterator InIter, @\removedCC{Mutable}@RandomAccessIterator RAIter>
- requires CopyAssignable<RAIter::reference, InIter::value_type> &&
+ requires HasCopyAssign<RAIter::reference, InIter::value_type> &&
@\removedCC{SameType<RAIter::value_type\&, RAIter::reference> \&\& Swappable<RAIter::value_type> \&\&}@
@\removedCC{MoveConstructible<RAIter::value_type> \&\& MoveAssignable<RAIter::value_type> \&\&}@
@\addedCC{SwappableIterator<RAIter> \&\&}@
@@ -435,7 +435,7 @@
RAIter partial_sort_copy(InIter @\farg{first}@, InIter @\farg{last}@,
RAIter @\farg{result_first}@, RAIter @\farg{result_last}@);
template<InputIterator InIter, @\removedCC{Mutable}@RandomAccessIterator RAIter, class Compare>
- requires CopyAssignable<RAIter::reference, InIter::value_type> &&
+ requires HasCopyAssign<RAIter::reference, InIter::value_type> &&
@\removedCC{SameType<RAIter::value_type\&, RAIter::reference> \&\& Swappable<RAIter::value_type> \&\&}@
@\removedCC{MoveConstructible<RAIter::value_type> \&\& MoveAssignable<RAIter::value_type> \&\&}@
@\addedCC{SwappableIterator<RAIter> \&\&}@
@@ -1407,7 +1407,7 @@
\index{copy_backward@\tcode{copy_backward}}%
\color{addclr}\begin{itemdecl}
template<BidirectionalIterator InIter, MutableBidirectionalIterator OutIter>
- requires CopyAssignable<OutIter::reference, InIter::reference>
+ requires HasCopyAssign<OutIter::reference, InIter::reference>
OutIter copy_backward(InIter @\farg{first}@, InIter @\farg{last}@,
OutIter @\farg{result}@);
\end{itemdecl}\color{black}
@@ -1492,7 +1492,7 @@
\color{addclr}
\begin{itemdecl}
template<BidirectionalIterator InIter, BidirectionalIterator OutIter>
- requires MoveAssignable<OutIter::reference, InIter::value_type>
+ requires HasMoveAssign<OutIter::reference, InIter::value_type>
OutIter move_backward(InIter first, InIter last,
OutIter result);
\end{itemdecl}
@@ -1695,12 +1695,12 @@
\index{replace_if@\tcode{replace_if}}%
\color{addclr}\begin{itemdecl}
template<MutableForwardIterator Iter, class T>
- requires HasEqualTo<Iter::reference, T> && CopyAssignable<Iter::reference, T>
+ requires HasEqualTo<Iter::reference, T> && HasCopyAssign<Iter::reference, T>
void replace(Iter @\farg{first}@, Iter @\farg{last}@,
const T& @\farg{old_value}@, const T& @\farg{new_value}@);
@\textcolor{addclr}{template}@<MutableForwardIterator Iter, Predicate<auto, Iter::reference> Pred, class T>
- requires CopyAssignable<Iter::reference, T>
+ requires HasCopyAssign<Iter::reference, T>
void replace_if(Iter @\farg{first}@, Iter @\farg{last}@,
Pred @\farg{pred}@, const T& @\farg{new_value}@);
\end{itemdecl}\color{black}
@@ -1732,14 +1732,14 @@
\index{replace_copy_if@\tcode{replace_copy_if}}%
\color{addclr}\begin{itemdecl}
template<InputIterator InIter, OutputIterator<auto, InIter::value_type> OutIter, class T>
- requires CopyAssignable<OutIter::reference, T> && HasEqualTo<InIter::reference, T>
+ requires HasCopyAssign<OutIter::reference, T> && HasEqualTo<InIter::reference, T>
OutIter replace_copy(InIter @\farg{first}@, InIter @\farg{last}@,
OutIter @\farg{result}@,
const T& @\farg{old_value}@, const T& @\farg{new_value}@);
template<InputIterator InIter, OutputIterator<auto, InIter::value_type> OutIter,
Predicate<auto, InIter::reference> Pred, class T>
- requires CopyAssignable<OutIter::reference, T>
+ requires HasCopyAssign<OutIter::reference, T>
OutIter replace_copy_if(InIter @\farg{first}@, InIter @\farg{last}@,
OutIter @\farg{result}@,
Pred @\farg{pred}@, const T& @\farg{new_value}@);
@@ -1796,7 +1796,7 @@
\index{fill_n@\tcode{fill_n}}%
\color{addclr}\begin{itemdecl}
template<MutableForwardIterator Iter, class T>
- requires CopyAssignable<Iter::reference, T>
+ requires HasCopyAssign<Iter::reference, T>
void fill(Iter @\farg{first}@, Iter @\farg{last}@, const T& @\farg{value}@);
template<class Iter, Integral Size, class T>
@@ -1835,7 +1835,7 @@
\index{generate_n@\tcode{generate_n}}%
\color{addclr}\begin{itemdecl}
template<MutableForwardIterator Iter, Callable Generator>
- requires CopyAssignable<Iter::reference, Generator::result_type>
+ requires HasCopyAssign<Iter::reference, Generator::result_type>
void generate(Iter @\farg{first}@, Iter @\farg{last}@,
Generator @\farg{gen}@);
@@ -2024,7 +2024,7 @@
@\textcolor{addclr}{template}@<InputIterator InIter, MutableForwardIterator OutIter>
requires HasEqualTo<OutIter::reference, InIter::value_type> &&
- CopyAssignable<OutIter::reference, InIter::reference> &&
+ HasCopyAssign<OutIter::reference, InIter::reference> &&
!ForwardIterator<InIter>
OutIter unique_copy(InIter @\farg{first}@, InIter @\farg{last}@,
OutIter @\farg{result}@);
@@ -2043,7 +2043,7 @@
template<InputIterator InIter, MutableForwardIterator OutIter,
Predicate<auto, OutIter::reference, InIter::reference> Pred>
- requires CopyAssignable<OutIter::reference, InIter::reference> &&
+ requires HasCopyAssign<OutIter::reference, InIter::reference> &&
!ForwardIterator<InIter>
OutIter unique_copy(InIter @\farg{first}@, InIter @\farg{last}@,
OutIter @\farg{result}@, Pred @\farg{pred}@);
@@ -2051,7 +2051,7 @@
\color{black}
\editorial{We assume (and require!) the proposed resolution to DR 538,
- which adds the \tcode{CopyAssignable} requirement.}
+ which adds the \tcode{HasCopyAssign} requirement.}
\editorial{Note that we have split the two signatures of
\tcode{unique_copy} into six signatures, to cover the actual
@@ -2565,7 +2565,7 @@
\index{partial_sort_copy@\tcode{partial_sort_copy}}%
\color{addclr}\begin{itemdecl}
template<InputIterator InIter, MutableRandomAccessIterator RAIter>
- requires CopyAssignable<RAIter::reference, InIter::value_type> &&
+ requires HasCopyAssign<RAIter::reference, InIter::value_type> &&
SameType<RAIter::value_type&, RAIter::reference> && Swappable<RAIter::value_type> &&
MoveConstructible<RAIter::value_type> && MoveAssignable<RAIter::value_type> &&
HasLess<InIter::value_type, RAIter::value_type> &&
@@ -2575,7 +2575,7 @@
RAIter @\farg{result_first}@, RAIter @\farg{result_last}@);
template<InputIterator InIter, MutableRandomAccessIterator RAIter, class Compare>
- requires CopyAssignable<RAIter::reference, InIter::value_type> &&
+ requires HasCopyAssign<RAIter::reference, InIter::value_type> &&
SameType<RAIter::value_type&, RAIter::reference> && Swappable<RAIter::value_type> &&
MoveConstructible<RAIter::value_type> && MoveAssignable<RAIter::value_type> &&
Predicate<Compare, InIter::value_type, RAIter::value_type> &&
Modified: sandbox/committee/concepts/stdlib/clib-concepts.tex
==============================================================================
--- sandbox/committee/concepts/stdlib/clib-concepts.tex (original)
+++ sandbox/committee/concepts/stdlib/clib-concepts.tex 2008-05-15 15:21:13 EDT (Thu, 15 May 2008)
@@ -73,8 +73,20 @@
\begin{itemize}
\item Added the \tcode{Has*Assign} concepts, which are required by
\tcode{valarray} and friends.
+\item Split \tcode{MoveAssignable} into the two-parameter
+ \tcode{HasMoveAssign} and the one-parameter \tcode{MoveAssignable};
+ the same split is also used for \tcode{CopyAssignable} and
+ \tcode{HasCopyAssign}.
\item Added the \tcode{MemberPointeeType} concept, and revised
\tcode{ReferentType} to permit reference types.
+\item Renamed \tcode{HeapAllocatable} to \tcode{FreeStoreAllocatable},
+ which better reflects the terminology of the standard.
+\item Changed the \tcode{IntegralLike} requirement for a \tcode{long
+ long} constructor into a requirement for a \tcode{intmax_t}
+ constructor.
+\item Added the \tcode{EqualityComparable} refinement to the
+ \tcode{Allocator} concept, and made its \tcode{construct} variadic
+ to match the latest \tcode{Allocator} requirements.
\end{itemize}
\end{titlepage}
@@ -156,7 +168,7 @@
// \ref{concept.comparison}, comparisons:
auto concept LessThanComparable<typename T> @\textit{see below}@;
auto concept EqualityComparable<typename T> @\textit{see below}@;
- auto concept TriviallyEqualityComparable<typename T> @\textit{see below}@;
+ @\removedCC{auto}@ concept TriviallyEqualityComparable<typename T> @\textit{see below}@;
// \ref{concept.destruct}, destruction:
auto concept Destructible<typename T> @\textit{see below}@;
@@ -171,13 +183,13 @@
auto concept MoveConstructible<typename T> @\textit{see below}@;
auto concept CopyConstructible<typename T> @\textit{see below}@;
concept TriviallyCopyConstructible<typename T> @\textit{see below}@;
- auto concept MoveAssignable<typename T, typename U = T> @\textit{see below}@;
- auto concept CopyAssignable<typename T, typename U = T> @\textit{see below}@;
+ auto concept MoveAssignable<typename T> @\textit{see below}@;
+ auto concept CopyAssignable<typename T> @\textit{see below}@;
concept TriviallyCopyAssignable<typename T> @\textit{see below}@;
auto concept Swappable<typename T> @\textit{see below}@;
// \ref{concept.memory}, memory allocation:
- auto concept HeapAllocatable<typename T> @\textit{see below}@;
+ auto concept FreeStoreAllocatable<typename T> @\textit{see below}@;
// \ref{concept.regular}, regular types:
auto concept Semiregular<typename T> @\textit{see below}@;
@@ -213,6 +225,8 @@
auto concept Dereferenceable<typename T> @\textit{see below}@;
auto concept Addressable<typename T> @\textit{see below}@;
auto concept Callable<typename F, typename... Args> @\textit{see below}@;
+ auto concept HasMoveAssign<typename T, typename U = T> @\textit{see below}@;
+ auto concept HasCopyAssign<typename T, typename U = T> @\textit{see below}@;
auto concept HasPlusAssign<typename T, typename U = T> @\textit{see below}@;
auto concept HasMinusAssign<typename T, typename U = T> @\textit{see below}@;
auto concept HasMultiplyAssign<typename T, typename U = T> @\textit{see below}@;
@@ -260,7 +274,9 @@
return type of a function.}
\pnum
-\addedConcepts{\mbox{\requires} for every type \mbox{\tcode{T}} that is
+\addedConcepts{\mbox{\requires} for every}
+\addedCC{non-array}
+\addedConcepts{type \mbox{\tcode{T}} that is
\mbox{\techterm{cv}} \mbox{\tcode{void}} or that meets the
requirement \mbox{\tcode{MoveConstructible<T>}}
(\mbox{\ref{concept.copymove}}), the concept map
@@ -371,7 +387,7 @@
\end{itemdescr}
\begin{itemdecl}
-concept Class<typename T> : ClassType<Class> { }
+concept Class<typename T> : ClassType<T> { }
\end{itemdecl}
\begin{itemdescr}
@@ -590,8 +606,8 @@
\end{itemdescr}
\begin{itemdecl}
-auto concept EqualityComparable<typename T> : EqualTo<T> {
- bool operator!=(T const& a, U const& b) { return !(a == b); }
+auto concept EqualityComparable<typename T> : HasEqualTo<T> {
+ bool operator!=(T const& a, T const& b) { return !(a == b); }
axiom Consistency(T a, T b) {
(a == b) == !(a != b);
@@ -722,7 +738,6 @@
\begin{itemdecl}
auto concept CopyConstructible<typename T> : MoveConstructible<T>, HasConstructor<T, const T&> {
- @\addedCC{requires EqualityComparable<T>}@
axiom CopyPreservation(T x) {
T(x) == x;
}
@@ -752,10 +767,7 @@
\end{itemdescr}
\begin{itemdecl}
-auto concept MoveAssignable<typename T, typename U = T> {
- typename result_type;
- result_type T::operator=(U&&);
-}
+auto concept MoveAssignable<typename T> : HasMoveAssign<T> { }
\end{itemdecl}
\begin{itemdescr}
@@ -765,7 +777,7 @@
\end{itemdescr}
\begin{itemdecl}
-result_type T::operator=(U&& rv);
+result_type T::operator=(T&& rv); // inherited from HasMoveAssign
\end{itemdecl}
\begin{itemdescr}
@@ -779,12 +791,8 @@
\end{itemdescr}
\begin{itemdecl}
-auto concept CopyAssignable<typename T, typename U = T> : MoveAssignable<T, U> {
- typename result_type;
- result_type T::operator=(const U&);
-
- @\addedCC{requires EqualityComparable<T, U>}@
- axiom CopyPreservation(T& x, U y) {
+auto concept CopyAssignable<typename T> : MoveAssignable<T> {
+ axiom CopyPreservation(T& x, T y) {
(x = y, x) == y;
}
}
@@ -801,7 +809,7 @@
requirement for most of the uses of \tcode{CopyAssignable}, so we have
weakened \tcode{CopyAssignable} to not require anything of its return
type. When we need a \tcode{T\&}, we'll add that as an explicit
- requirement. See, e.g., the \tcode{Integral} concept.}}
+ requirement. See, e.g., the \tcode{IntegralLike} concept.}}
\begin{itemdecl}
concept TriviallyCopyAssignable<typename T> : CopyAssignable<T> { }
@@ -845,7 +853,7 @@
\rSec2[concept.memory]{Memory allocation}
\begin{itemdecl}
-auto concept HeapAllocatable<typename T> {
+auto concept FreeStoreAllocatable<typename T> {
void* T::operator new(size_t size);
void* T::operator new(size_t size, void*);
void* T::operator new[](size_t size);
@@ -857,14 +865,14 @@
\begin{itemdescr}
\pnum
\addedConcepts{\mbox{\reallynote} describes types for which objects and
-arrays of objects can be allocated on or freed from the heap with
+arrays of objects can be allocated on or freed from the free store with
\mbox{\tcode{new}} and \mbox{\tcode{delete}}.}
\end{itemdescr}
\rSec2[concept.regular]{Regular types}
\begin{itemdecl}
-auto concept Semiregular<typename T> : CopyConstructible<T>, CopyAssignable<T>, HeapAllocatable<T> {
+auto concept Semiregular<typename T> : CopyConstructible<T>, CopyAssignable<T>, FreeStoreAllocatable<T> {
requires SameType<CopyAssignable<T>::result_type, T&>;
}
\end{itemdecl}
@@ -883,8 +891,7 @@
\begin{itemdescr}
\pnum
\addedConcepts{\mbox{\reallynote} describes semi-regular types that are default
-constructible, have equality comparison operators, and can be
-allocated on the heap.}
+constructible and have equality comparison operators.}
\end{itemdescr}
\rSec2[concept.convertible]{Convertibility}
@@ -1183,6 +1190,32 @@
\end{itemdescr}
\begin{itemdecl}
+auto concept HasMoveAssign<typename T, typename U = T> {
+ typename result_type;
+ result_type T::operator=(U&&);
+}
+\end{itemdecl}
+
+\begin{itemdescr}
+\pnum
+\addedCC{\mbox{\reallynote} describes types with the ability
+ to assign to an object from an rvalue (which may have a different
+ type), potentially altering the rvalue.}
+\end{itemdescr}
+
+\begin{itemdecl}
+auto concept HasCopyAssign<typename T, typename U = T> : HasMoveAssign<T, U> {
+ result_type T::operator=(const U&);
+}
+\end{itemdecl}
+
+\begin{itemdescr}
+\pnum
+\addedCC{\mbox{\reallynote} describes types with the ability to assign to an
+object (which may have a different type).}
+\end{itemdescr}
+
+\begin{itemdecl}
auto concept HasPlusAssign<typename T, typename U = T> {
typename result_type;
result_type operator+=(T&, const U&);
@@ -1308,7 +1341,7 @@
concept ArithmeticLike<typename T>
: Regular<T>, LessThanComparable<T>, HasPlus<T>, HasMinus<T>, HasMultiply<T>, HasDivide<T>,
HasUnaryPlus<T>, HasNegate<T> {
- T::T(long long);
+ T::T(@\changedCC{long long}{intmax_t}@);
@\addedCC{T::T(long double);}@
T& operator++(T&);
@@ -1376,7 +1409,7 @@
\addedConcepts{\mbox{\requires} for every signed integral type
\mbox{\tcode{T}} ([basic.fundamental]), including signed extended
integral types, an empty concept map
- \mbox{\tcode{SignedIntegral<T>}} shall be defined in namespace
+ \mbox{\tcode{SignedIntegralLike<T>}} shall be defined in namespace
\mbox{\tcode{std}}.}
\end{itemdescr}
@@ -1393,7 +1426,7 @@
\addedConcepts{\mbox{\requires} for every unsigned integral type
\mbox{\tcode{T}} ([basic.fundamental]), including unsigned extended
integral types, an empty concept map
- \mbox{\tcode{UnsignedIntegral<T>}} shall be defined in namespace
+ \mbox{\tcode{UnsignedIntegralLike<T>}} shall be defined in namespace
\mbox{\tcode{std}}.}
\end{itemdescr}
@@ -1408,7 +1441,7 @@
\pnum
\addedConcepts{\mbox{\requires}
for every floating point type \mbox{\tcode{T}} ([basic.fundamental]),
-an empty concept map \mbox{\tcode{FloatingPoint<T>}} shall be defined
+an empty concept map \mbox{\tcode{FloatingPointLike<T>}} shall be defined
in namespace \mbox{\tcode{std}}.}
\end{itemdescr}
@@ -1467,7 +1500,7 @@
\color{addclr}
\begin{itemdecl}
-concept Allocator<typename X> : DefaultConstructible<X>, CopyConstructible<X> {
+concept Allocator<typename X> : DefaultConstructible<X>, CopyConstructible<X>, EqualityComparable<X> {
ObjectType value_type = typename X::value_type;
MutableRandomAccessIterator pointer = typename X::pointer;
RandomAccessIterator const_pointer = typename X::const_pointer;
@@ -1499,10 +1532,9 @@
template<ObjectType T>
X::X(const rebind<T>& y);
- @\removedConcepts{void X::construct(pointer p, const value_type\&);}@
- template<typename V>
- requires Convertible<V, value_type>
- @\textcolor{addclr}{void}@ X::construct(pointer p, V&&);
+ template<class... Args>
+ requires HasConstructor<value_type, Args&&...>
+ void construct(pointer p, Args&&... args);
void X::destroy(pointer p);
@@ -1643,22 +1675,16 @@
\color{addclr}
\begin{itemdecl}
-template<typename V>
- requires HasConstructor<value_type, V>
- void X::construct(pointer p, V&&);
+template<class... Args>
+ requires HasConstructor<value_type, Args&&...>
+ void X::construct(pointer p, Args&&... args);
\end{itemdecl}
\color{black}
-\editorial{The non-templated \tcode{X::construct} has been removed
-from the \tcode{Allocator} requirements because it implies that the
-\tcode{value_type} is \tcode{CopyConstructible} (which we do not want
-as a requirement in the \tcode{Allocator} concept). The templated
-version is more general, allowing in-place and move construction.}
-
\begin{itemdescr}
\pnum
\effects\
-\tcode{::new((void*)p) T(forward<V>(v))}
+\tcode{::new((void*)p) T(forward<Args>(args)...)}
\end{itemdescr}
\color{addclr}
@@ -1755,4 +1781,8 @@
semantics of containers and algorithms when allocator instances compare
non-equal, are implementation-defined.
+\section*{Acknowledgments}
+Daniel Kr\"ugler made many valuable suggestions that helper improve
+this document.
+
\end{document}
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