This commit is contained in:
2025-10-25 03:02:53 +03:00
commit 043225d523
3416 changed files with 681196 additions and 0 deletions

View File

@@ -0,0 +1,26 @@
[specialized.addressof]
# 20 Memory management library [[mem]](./#mem)
## 20.2 Memory [[memory]](memory#specialized.addressof)
### 20.2.11 addressof [specialized.addressof]
[🔗](#lib:addressof)
`template<class T> constexpr T* addressof(T& r) noexcept;
`
[1](#1)
[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/memory.tex#L2117)
*Returns*: The actual address of the object or function referenced by r, even in the
presence of an overloaded operator&[.](#1.sentence-1)
[2](#2)
[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/memory.tex#L2122)
*Remarks*: An expression addressof(E) is a constant subexpression ([[defns.const.subexpr]](defns.const.subexpr "3.15constant subexpression"))
if E is an lvalue constant subexpression[.](#2.sentence-1)

View File

@@ -0,0 +1,764 @@
[specialized.algorithms]
# 26 Algorithms library [[algorithms]](./#algorithms)
## 26.11 Specialized <memory> algorithms [specialized.algorithms]
### [26.11.1](#general) General [[specialized.algorithms.general]](specialized.algorithms.general)
[1](#general-1)
[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/algorithms.tex#L13503)
The contents specified in [specialized.algorithms]
are declared in the header [<memory>](memory.syn#header:%3cmemory%3e "20.2.2Header <memory> synopsis[memory.syn]")[.](#general-1.sentence-1)
[2](#general-2)
[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/algorithms.tex#L13507)
Unless otherwise specified,
if an exception is thrown in the following algorithms,
objects constructed by a placement [*new-expression*](expr.new#nt:new-expression "7.6.2.8New[expr.new]") ([[expr.new]](expr.new "7.6.2.8New"))
are destroyed in an unspecified order
before allowing the exception to propagate[.](#general-2.sentence-1)
[3](#general-3)
[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/algorithms.tex#L13514)
[*Note [1](#general-note-1)*:
When new objects are created by
the algorithms specified in [specialized.algorithms],
the lifetime ends for any existing objects
(including potentially-overlapping subobjects [[intro.object]](intro.object "6.8.2Object model"))
in storage that is reused [[basic.life]](basic.life "6.8.4Lifetime")[.](#general-3.sentence-1)
— *end note*]
[4](#general-4)
[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/algorithms.tex#L13523)
Some algorithms specified in [specialized.algorithms]
make use of the following exposition-only function templates:template<class T>constexpr void* *voidify*(T& obj) noexcept {return addressof(obj); }template<class I>decltype(auto) *deref-move*(I& it) {if constexpr (is_lvalue_reference_v<decltype(*it)>)return std::move(*it); elsereturn *it; }
### [26.11.2](#special.mem.concepts) Special memory concepts [[special.mem.concepts]](special.mem.concepts)
[1](#special.mem.concepts-1)
[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/algorithms.tex#L13543)
Some algorithms in this subclause are constrained with the following
exposition-only concepts:
[🔗](#concept:nothrow-input-iterator)
`template<class I>
concept [nothrow-input-iterator](#concept:nothrow-input-iterator "26.11.2Special memory concepts[special.mem.concepts]") = // exposition only
[input_iterator](iterator.concept.input#concept:input_iterator "24.3.4.9Concept input_­iterator[iterator.concept.input]")<I> &&
is_lvalue_reference_v<iter_reference_t<I>> &&
[same_as](concept.same#concept:same_as "18.4.2Concept same_­as[concept.same]")<remove_cvref_t<iter_reference_t<I>>, iter_value_t<I>>;
`
[2](#special.mem.concepts-2)
[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/algorithms.tex#L13555)
A type I models [*nothrow-input-iterator*](#concept:nothrow-input-iterator "26.11.2Special memory concepts[special.mem.concepts]") only if
no exceptions are thrown from increment,
copy construction, move construction,
copy assignment, move assignment,
or indirection through valid iterators[.](#special.mem.concepts-2.sentence-1)
[3](#special.mem.concepts-3)
[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/algorithms.tex#L13562)
[*Note [1](#special.mem.concepts-note-1)*:
This concept allows some [input_iterator](iterator.concept.input#concept:input_iterator "24.3.4.9Concept input_­iterator[iterator.concept.input]") ([[iterator.concept.input]](iterator.concept.input "24.3.4.9Concept input_­iterator"))
operations to throw exceptions[.](#special.mem.concepts-3.sentence-1)
— *end note*]
[🔗](#concept:nothrow-sentinel-for)
`template<class S, class I>
concept [nothrow-sentinel-for](#concept:nothrow-sentinel-for "26.11.2Special memory concepts[special.mem.concepts]") = [sentinel_for](iterator.concept.sentinel#concept:sentinel_for "24.3.4.7Concept sentinel_­for[iterator.concept.sentinel]")<S, I>; // exposition only
`
[4](#special.mem.concepts-4)
[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/algorithms.tex#L13575)
Types S and I model [*nothrow-sentinel-for*](#concept:nothrow-sentinel-for "26.11.2Special memory concepts[special.mem.concepts]") only if no exceptions are thrown from copy construction, move construction,
copy assignment, move assignment, or comparisons between
valid values of type I and S[.](#special.mem.concepts-4.sentence-1)
[5](#special.mem.concepts-5)
[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/algorithms.tex#L13581)
[*Note [2](#special.mem.concepts-note-2)*:
This concept allows some [sentinel_for](iterator.concept.sentinel#concept:sentinel_for "24.3.4.7Concept sentinel_­for[iterator.concept.sentinel]") ([[iterator.concept.sentinel]](iterator.concept.sentinel "24.3.4.7Concept sentinel_­for"))
operations to throw exceptions[.](#special.mem.concepts-5.sentence-1)
— *end note*]
[🔗](#concept:nothrow-sized-sentinel-for)
`template<class S, class I>
concept [nothrow-sized-sentinel-for](#concept:nothrow-sized-sentinel-for "26.11.2Special memory concepts[special.mem.concepts]") = // exposition only
[nothrow-sentinel-for](#concept:nothrow-sentinel-for "26.11.2Special memory concepts[special.mem.concepts]")<S, I> &&
[sized_sentinel_for](iterator.concept.sizedsentinel#concept:sized_sentinel_for "24.3.4.8Concept sized_­sentinel_­for[iterator.concept.sizedsentinel]")<S, I>;
`
[6](#special.mem.concepts-6)
[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/algorithms.tex#L13596)
Types S and I model [*nothrow-sized-sentinel-for*](#concept:nothrow-sized-sentinel-for "26.11.2Special memory concepts[special.mem.concepts]") only if no exceptions are thrown from the - operator
for valid values of type I and S[.](#special.mem.concepts-6.sentence-1)
[7](#special.mem.concepts-7)
[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/algorithms.tex#L13601)
[*Note [3](#special.mem.concepts-note-3)*:
This concept allows some [sized_sentinel_for](iterator.concept.sizedsentinel#concept:sized_sentinel_for "24.3.4.8Concept sized_­sentinel_­for[iterator.concept.sizedsentinel]") ([[iterator.concept.sizedsentinel]](iterator.concept.sizedsentinel "24.3.4.8Concept sized_­sentinel_­for"))
operations to throw exceptions[.](#special.mem.concepts-7.sentence-1)
— *end note*]
[🔗](#concept:nothrow-input-range)
`template<class R>
concept [nothrow-input-range](#concept:nothrow-input-range "26.11.2Special memory concepts[special.mem.concepts]") = // exposition only
[range](range.range#concept:range "25.4.2Ranges[range.range]")<R> &&
[nothrow-input-iterator](#concept:nothrow-input-iterator "26.11.2Special memory concepts[special.mem.concepts]")<iterator_t<R>> &&
[nothrow-sentinel-for](#concept:nothrow-sentinel-for "26.11.2Special memory concepts[special.mem.concepts]")<sentinel_t<R>, iterator_t<R>>;
`
[8](#special.mem.concepts-8)
[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/algorithms.tex#L13617)
A type R models [*nothrow-input-range*](#concept:nothrow-input-range "26.11.2Special memory concepts[special.mem.concepts]") only if
no exceptions are thrown from calls to ranges::begin andranges::end on an object of type R[.](#special.mem.concepts-8.sentence-1)
[🔗](#concept:nothrow-forward-iterator)
`template<class I>
concept [nothrow-forward-iterator](#concept:nothrow-forward-iterator "26.11.2Special memory concepts[special.mem.concepts]") = // exposition only
[nothrow-input-iterator](#concept:nothrow-input-iterator "26.11.2Special memory concepts[special.mem.concepts]")<I> &&
[forward_iterator](iterator.concept.forward#concept:forward_iterator "24.3.4.11Concept forward_­iterator[iterator.concept.forward]")<I> &&
[nothrow-sentinel-for](#concept:nothrow-sentinel-for "26.11.2Special memory concepts[special.mem.concepts]")<I, I>;
`
[9](#special.mem.concepts-9)
[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/algorithms.tex#L13632)
[*Note [4](#special.mem.concepts-note-4)*:
This concept allows some [forward_iterator](iterator.concept.forward#concept:forward_iterator "24.3.4.11Concept forward_­iterator[iterator.concept.forward]") ([[iterator.concept.forward]](iterator.concept.forward "24.3.4.11Concept forward_­iterator"))
operations to throw exceptions[.](#special.mem.concepts-9.sentence-1)
— *end note*]
[🔗](#concept:nothrow-forward-range)
`template<class R>
concept [nothrow-forward-range](#concept:nothrow-forward-range "26.11.2Special memory concepts[special.mem.concepts]") = // exposition only
[nothrow-input-range](#concept:nothrow-input-range "26.11.2Special memory concepts[special.mem.concepts]")<R> &&
[nothrow-forward-iterator](#concept:nothrow-forward-iterator "26.11.2Special memory concepts[special.mem.concepts]")<iterator_t<R>>;
`
[🔗](#concept:nothrow-bidirectional-iterator)
`template<class I>
concept [nothrow-bidirectional-iterator](#concept:nothrow-bidirectional-iterator "26.11.2Special memory concepts[special.mem.concepts]") = // exposition only
[nothrow-forward-iterator](#concept:nothrow-forward-iterator "26.11.2Special memory concepts[special.mem.concepts]")<I> &&
[bidirectional_iterator](iterator.concept.bidir#concept:bidirectional_iterator "24.3.4.12Concept bidirectional_­iterator[iterator.concept.bidir]")<I>;
`
[10](#special.mem.concepts-10)
[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/algorithms.tex#L13654)
A type I models [*nothrow-bidirectional-iterator*](#concept:nothrow-bidirectional-iterator "26.11.2Special memory concepts[special.mem.concepts]") only if no exceptions are thrown from decrementing valid iterators[.](#special.mem.concepts-10.sentence-1)
[*Note [5](#special.mem.concepts-note-5)*:
This concept allows some [bidirectional_iterator](iterator.concept.bidir#concept:bidirectional_iterator "24.3.4.12Concept bidirectional_­iterator[iterator.concept.bidir]") ([[iterator.concept.bidir]](iterator.concept.bidir "24.3.4.12Concept bidirectional_­iterator"))
operations to throw exceptions[.](#special.mem.concepts-10.sentence-2)
— *end note*]
[🔗](#concept:nothrow-bidirectional-range)
`template<class R>
concept [nothrow-bidirectional-range](#concept:nothrow-bidirectional-range "26.11.2Special memory concepts[special.mem.concepts]") = // exposition only
[nothrow-forward-range](#concept:nothrow-forward-range "26.11.2Special memory concepts[special.mem.concepts]")<R> &&
[nothrow-bidirectional-iterator](#concept:nothrow-bidirectional-iterator "26.11.2Special memory concepts[special.mem.concepts]")<iterator_t<R>>;
`
[🔗](#concept:nothrow-random-access-iterator)
`template<class I>
concept [nothrow-random-access-iterator](#concept:nothrow-random-access-iterator "26.11.2Special memory concepts[special.mem.concepts]") = // exposition only
[nothrow-bidirectional-iterator](#concept:nothrow-bidirectional-iterator "26.11.2Special memory concepts[special.mem.concepts]")<I> &&
[random_access_iterator](iterator.concept.random.access#concept:random_access_iterator "24.3.4.13Concept random_­access_­iterator[iterator.concept.random.access]")<I> &&
[nothrow-sized-sentinel-for](#concept:nothrow-sized-sentinel-for "26.11.2Special memory concepts[special.mem.concepts]")<I, I>;
`
[11](#special.mem.concepts-11)
[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/algorithms.tex#L13679)
A type I models [*nothrow-random-access-iterator*](#concept:nothrow-random-access-iterator "26.11.2Special memory concepts[special.mem.concepts]") only if no exceptions are thrown from comparisons of valid iterators,
or the -, +, -=, +=, [] operators
on valid values of type I and iter_difference_t<I>[.](#special.mem.concepts-11.sentence-1)
[*Note [6](#special.mem.concepts-note-6)*:
This concept allows some [random_access_iterator](iterator.concept.random.access#concept:random_access_iterator "24.3.4.13Concept random_­access_­iterator[iterator.concept.random.access]") ([[iterator.concept.random.access]](iterator.concept.random.access "24.3.4.13Concept random_­access_­iterator"))
operations to throw exceptions[.](#special.mem.concepts-11.sentence-2)
— *end note*]
[🔗](#special.mem.concepts-itemdecl:10)
`template<class R>
concept [nothrow-random-access-range](#concept:nothrow-random-access-range "26.11.2Special memory concepts[special.mem.concepts]") = // exposition only
[nothrow-bidirectional-range](#concept:nothrow-bidirectional-range "26.11.2Special memory concepts[special.mem.concepts]")<R> &&
[nothrow-random-access-iterator](#concept:nothrow-random-access-iterator "26.11.2Special memory concepts[special.mem.concepts]")<iterator_t<R>>;
template<class R>
concept [nothrow-sized-random-access-range](#concept:nothrow-sized-random-access-range "26.11.2Special memory concepts[special.mem.concepts]") = // exposition only
[nothrow-random-access-range](#concept:nothrow-random-access-range "26.11.2Special memory concepts[special.mem.concepts]")<R> && [sized_range](range.sized#concept:sized_range "25.4.4Sized ranges[range.sized]")<R>;
`
[12](#special.mem.concepts-12)
[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/algorithms.tex#L13702)
A type R models [*nothrow-sized-random-access-range*](#concept:nothrow-sized-random-access-range "26.11.2Special memory concepts[special.mem.concepts]") only if no exceptions are thrown from the call to ranges::size on an object of type R[.](#special.mem.concepts-12.sentence-1)
### [26.11.3](#uninitialized.construct.default) uninitialized_default_construct [[uninitialized.construct.default]](uninitialized.construct.default)
[🔗](#lib:uninitialized_default_construct)
`template<class NoThrowForwardIterator>
constexpr void uninitialized_default_construct(NoThrowForwardIterator first,
NoThrowForwardIterator last);
`
[1](#uninitialized.construct.default-1)
[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/algorithms.tex#L13718)
*Effects*: Equivalent to:for (; first != last; ++first)::new (*voidify*(*first))typename iterator_traits<NoThrowForwardIterator>::value_type;
[🔗](#lib:uninitialized_default_construct_)
`namespace ranges {
template<[nothrow-forward-iterator](#concept:nothrow-forward-iterator "26.11.2Special memory concepts[special.mem.concepts]") I, [nothrow-sentinel-for](#concept:nothrow-sentinel-for "26.11.2Special memory concepts[special.mem.concepts]")<I> S>
requires [default_initializable](concept.default.init#concept:default_initializable "18.4.12Concept default_­initializable[concept.default.init]")<iter_value_t<I>>
constexpr I uninitialized_default_construct(I first, S last);
template<[nothrow-forward-range](#concept:nothrow-forward-range "26.11.2Special memory concepts[special.mem.concepts]") R>
requires [default_initializable](concept.default.init#concept:default_initializable "18.4.12Concept default_­initializable[concept.default.init]")<range_value_t<R>>
constexpr borrowed_iterator_t<R> uninitialized_default_construct(R&& r);
}
`
[2](#uninitialized.construct.default-2)
[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/algorithms.tex#L13741)
*Effects*: Equivalent to:for (; first != last; ++first)::new (*voidify*(*first)) remove_reference_t<iter_reference_t<I>>;return first;
[🔗](#lib:uninitialized_default_construct_n)
`template<class NoThrowForwardIterator, class Size>
constexpr NoThrowForwardIterator
uninitialized_default_construct_n(NoThrowForwardIterator first, Size n);
`
[3](#uninitialized.construct.default-3)
[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/algorithms.tex#L13759)
*Effects*: Equivalent to:for (; n > 0; (void)++first, --n)::new (*voidify*(*first))typename iterator_traits<NoThrowForwardIterator>::value_type;return first;
[🔗](#lib:uninitialized_default_construct_n_)
`namespace ranges {
template<[nothrow-forward-iterator](#concept:nothrow-forward-iterator "26.11.2Special memory concepts[special.mem.concepts]") I>
requires [default_initializable](concept.default.init#concept:default_initializable "18.4.12Concept default_­initializable[concept.default.init]")<iter_value_t<I>>
constexpr I uninitialized_default_construct_n(I first, iter_difference_t<I> n);
}
`
[4](#uninitialized.construct.default-4)
[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/algorithms.tex#L13780)
*Effects*: Equivalent to:return uninitialized_default_construct(counted_iterator(first, n),
default_sentinel).base();
### [26.11.4](#uninitialized.construct.value) uninitialized_value_construct [[uninitialized.construct.value]](uninitialized.construct.value)
[🔗](#lib:uninitialized_value_construct)
`template<class NoThrowForwardIterator>
constexpr void uninitialized_value_construct(NoThrowForwardIterator first,
NoThrowForwardIterator last);
`
[1](#uninitialized.construct.value-1)
[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/algorithms.tex#L13799)
*Effects*: Equivalent to:for (; first != last; ++first)::new (*voidify*(*first))typename iterator_traits<NoThrowForwardIterator>::value_type();
[🔗](#lib:uninitialized_value_construct_)
`namespace ranges {
template<[nothrow-forward-iterator](#concept:nothrow-forward-iterator "26.11.2Special memory concepts[special.mem.concepts]") I, [nothrow-sentinel-for](#concept:nothrow-sentinel-for "26.11.2Special memory concepts[special.mem.concepts]")<I> S>
requires [default_initializable](concept.default.init#concept:default_initializable "18.4.12Concept default_­initializable[concept.default.init]")<iter_value_t<I>>
constexpr I uninitialized_value_construct(I first, S last);
template<[nothrow-forward-range](#concept:nothrow-forward-range "26.11.2Special memory concepts[special.mem.concepts]") R>
requires [default_initializable](concept.default.init#concept:default_initializable "18.4.12Concept default_­initializable[concept.default.init]")<range_value_t<R>>
constexpr borrowed_iterator_t<R> uninitialized_value_construct(R&& r);
}
`
[2](#uninitialized.construct.value-2)
[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/algorithms.tex#L13822)
*Effects*: Equivalent to:for (; first != last; ++first)::new (*voidify*(*first)) remove_reference_t<iter_reference_t<I>>();return first;
[🔗](#lib:uninitialized_value_construct_n)
`template<class NoThrowForwardIterator, class Size>
constexpr NoThrowForwardIterator
uninitialized_value_construct_n(NoThrowForwardIterator first, Size n);
`
[3](#uninitialized.construct.value-3)
[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/algorithms.tex#L13840)
*Effects*: Equivalent to:for (; n > 0; (void)++first, --n)::new (*voidify*(*first))typename iterator_traits<NoThrowForwardIterator>::value_type();return first;
[🔗](#lib:uninitialized_value_construct_n_)
`namespace ranges {
template<[nothrow-forward-iterator](#concept:nothrow-forward-iterator "26.11.2Special memory concepts[special.mem.concepts]") I>
requires [default_initializable](concept.default.init#concept:default_initializable "18.4.12Concept default_­initializable[concept.default.init]")<iter_value_t<I>>
constexpr I uninitialized_value_construct_n(I first, iter_difference_t<I> n);
}
`
[4](#uninitialized.construct.value-4)
[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/algorithms.tex#L13861)
*Effects*: Equivalent to:return uninitialized_value_construct(counted_iterator(first, n),
default_sentinel).base();
### [26.11.5](#uninitialized.copy) uninitialized_copy [[uninitialized.copy]](uninitialized.copy)
[🔗](#lib:uninitialized_copy)
`template<class InputIterator, class NoThrowForwardIterator>
constexpr NoThrowForwardIterator uninitialized_copy(InputIterator first, InputIterator last,
NoThrowForwardIterator result);
`
[1](#uninitialized.copy-1)
[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/algorithms.tex#L13880)
*Preconditions*: result+[0, (last - first)) does not overlap with [first, last)[.](#uninitialized.copy-1.sentence-1)
[2](#uninitialized.copy-2)
[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/algorithms.tex#L13884)
*Effects*: Equivalent to:for (; first != last; ++result, (void)++first)::new (*voidify*(*result))typename iterator_traits<NoThrowForwardIterator>::value_type(*first);
[3](#uninitialized.copy-3)
[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/algorithms.tex#L13893)
*Returns*: result[.](#uninitialized.copy-3.sentence-1)
[🔗](#lib:uninitialized_copy_)
`namespace ranges {
template<[input_iterator](iterator.concept.input#concept:input_iterator "24.3.4.9Concept input_­iterator[iterator.concept.input]") I, [sentinel_for](iterator.concept.sentinel#concept:sentinel_for "24.3.4.7Concept sentinel_­for[iterator.concept.sentinel]")<I> S1,
[nothrow-forward-iterator](#concept:nothrow-forward-iterator "26.11.2Special memory concepts[special.mem.concepts]") O, [nothrow-sentinel-for](#concept:nothrow-sentinel-for "26.11.2Special memory concepts[special.mem.concepts]")<O> S2>
requires [constructible_from](concept.constructible#concept:constructible_from "18.4.11Concept constructible_­from[concept.constructible]")<iter_value_t<O>, iter_reference_t<I>>
constexpr uninitialized_copy_result<I, O>
uninitialized_copy(I ifirst, S1 ilast, O ofirst, S2 olast);
template<[input_range](range.refinements#concept:input_range "25.4.6Other range refinements[range.refinements]") IR, [nothrow-forward-range](#concept:nothrow-forward-range "26.11.2Special memory concepts[special.mem.concepts]") OR>
requires [constructible_from](concept.constructible#concept:constructible_from "18.4.11Concept constructible_­from[concept.constructible]")<range_value_t<OR>, range_reference_t<IR>>
constexpr uninitialized_copy_result<borrowed_iterator_t<IR>, borrowed_iterator_t<OR>>
uninitialized_copy(IR&& in_range, OR&& out_range);
}
`
[4](#uninitialized.copy-4)
[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/algorithms.tex#L13914)
*Preconditions*: [ofirst, olast) does not overlap with [ifirst, ilast)[.](#uninitialized.copy-4.sentence-1)
[5](#uninitialized.copy-5)
[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/algorithms.tex#L13918)
*Effects*: Equivalent to:for (; ifirst != ilast && ofirst != olast; ++ofirst, (void)++ifirst)::new (*voidify*(*ofirst)) remove_reference_t<iter_reference_t<O>>(*ifirst);return {std::move(ifirst), ofirst};
[🔗](#lib:uninitialized_copy_n)
`template<class InputIterator, class Size, class NoThrowForwardIterator>
constexpr NoThrowForwardIterator uninitialized_copy_n(InputIterator first, Size n,
NoThrowForwardIterator result);
`
[6](#uninitialized.copy-6)
[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/algorithms.tex#L13936)
*Preconditions*: result+[0, n) does not overlap with first+[0, n)[.](#uninitialized.copy-6.sentence-1)
[7](#uninitialized.copy-7)
[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/algorithms.tex#L13940)
*Effects*: Equivalent to:for (; n > 0; ++result, (void)++first, --n)::new (*voidify*(*result))typename iterator_traits<NoThrowForwardIterator>::value_type(*first);
[8](#uninitialized.copy-8)
[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/algorithms.tex#L13949)
*Returns*: result[.](#uninitialized.copy-8.sentence-1)
[🔗](#lib:uninitialized_copy_n_)
`namespace ranges {
template<[input_iterator](iterator.concept.input#concept:input_iterator "24.3.4.9Concept input_­iterator[iterator.concept.input]") I, [nothrow-forward-iterator](#concept:nothrow-forward-iterator "26.11.2Special memory concepts[special.mem.concepts]") O, [nothrow-sentinel-for](#concept:nothrow-sentinel-for "26.11.2Special memory concepts[special.mem.concepts]")<O> S>
requires [constructible_from](concept.constructible#concept:constructible_from "18.4.11Concept constructible_­from[concept.constructible]")<iter_value_t<O>, iter_reference_t<I>>
constexpr uninitialized_copy_n_result<I, O>
uninitialized_copy_n(I ifirst, iter_difference_t<I> n, O ofirst, S olast);
}
`
[9](#uninitialized.copy-9)
[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/algorithms.tex#L13965)
*Preconditions*: [ofirst, olast) does not overlap withifirst+[0, n)[.](#uninitialized.copy-9.sentence-1)
[10](#uninitialized.copy-10)
[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/algorithms.tex#L13970)
*Effects*: Equivalent to:auto t = uninitialized_copy(counted_iterator(std::move(ifirst), n),
default_sentinel, ofirst, olast);return {std::move(t.in).base(), t.out};
### [26.11.6](#uninitialized.move) uninitialized_move [[uninitialized.move]](uninitialized.move)
[🔗](#lib:uninitialized_move)
`template<class InputIterator, class NoThrowForwardIterator>
constexpr NoThrowForwardIterator uninitialized_move(InputIterator first, InputIterator last,
NoThrowForwardIterator result);
`
[1](#uninitialized.move-1)
[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/algorithms.tex#L13990)
*Preconditions*: result+[0, (last - first)) does not overlap with [first, last)[.](#uninitialized.move-1.sentence-1)
[2](#uninitialized.move-2)
[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/algorithms.tex#L13994)
*Effects*: Equivalent to:for (; first != last; (void)++result, ++first)::new (*voidify*(*result))typename iterator_traits<NoThrowForwardIterator>::value_type(*deref-move*(first));return result;
[🔗](#lib:uninitialized_move_)
`namespace ranges {
template<[input_iterator](iterator.concept.input#concept:input_iterator "24.3.4.9Concept input_­iterator[iterator.concept.input]") I, [sentinel_for](iterator.concept.sentinel#concept:sentinel_for "24.3.4.7Concept sentinel_­for[iterator.concept.sentinel]")<I> S1,
[nothrow-forward-iterator](#concept:nothrow-forward-iterator "26.11.2Special memory concepts[special.mem.concepts]") O, [nothrow-sentinel-for](#concept:nothrow-sentinel-for "26.11.2Special memory concepts[special.mem.concepts]")<O> S2>
requires [constructible_from](concept.constructible#concept:constructible_from "18.4.11Concept constructible_­from[concept.constructible]")<iter_value_t<O>, iter_rvalue_reference_t<I>>
constexpr uninitialized_move_result<I, O>
uninitialized_move(I ifirst, S1 ilast, O ofirst, S2 olast);
template<[input_range](range.refinements#concept:input_range "25.4.6Other range refinements[range.refinements]") IR, [nothrow-forward-range](#concept:nothrow-forward-range "26.11.2Special memory concepts[special.mem.concepts]") OR>
requires [constructible_from](concept.constructible#concept:constructible_from "18.4.11Concept constructible_­from[concept.constructible]")<range_value_t<OR>, range_rvalue_reference_t<IR>>
constexpr uninitialized_move_result<borrowed_iterator_t<IR>, borrowed_iterator_t<OR>>
uninitialized_move(IR&& in_range, OR&& out_range);
}
`
[3](#uninitialized.move-3)
[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/algorithms.tex#L14021)
*Preconditions*: [ofirst, olast) does not overlap with [ifirst, ilast)[.](#uninitialized.move-3.sentence-1)
[4](#uninitialized.move-4)
[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/algorithms.tex#L14025)
*Effects*: Equivalent to:for (; ifirst != ilast && ofirst != olast; ++ofirst, (void)++ifirst)::new (*voidify*(*ofirst)) remove_reference_t<iter_reference_t<O>>(ranges::iter_move(ifirst));return {std::move(ifirst), ofirst};
[5](#uninitialized.move-5)
[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/algorithms.tex#L14035)
[*Note [1](#uninitialized.move-note-1)*:
If an exception is thrown, some objects in the range [ifirst, ilast) are
left in a valid, but unspecified state[.](#uninitialized.move-5.sentence-1)
— *end note*]
[🔗](#lib:uninitialized_move_n)
`template<class InputIterator, class Size, class NoThrowForwardIterator>
constexpr pair<InputIterator, NoThrowForwardIterator>
uninitialized_move_n(InputIterator first, Size n, NoThrowForwardIterator result);
`
[6](#uninitialized.move-6)
[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/algorithms.tex#L14050)
*Preconditions*: result+[0, n) does not overlap with first+[0, n)[.](#uninitialized.move-6.sentence-1)
[7](#uninitialized.move-7)
[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/algorithms.tex#L14054)
*Effects*: Equivalent to:for (; n > 0; ++result, (void)++first, --n)::new (*voidify*(*result))typename iterator_traits<NoThrowForwardIterator>::value_type(*deref-move*(first));return {first, result};
[🔗](#lib:uninitialized_move_n_)
`namespace ranges {
template<[input_iterator](iterator.concept.input#concept:input_iterator "24.3.4.9Concept input_­iterator[iterator.concept.input]") I, [nothrow-forward-iterator](#concept:nothrow-forward-iterator "26.11.2Special memory concepts[special.mem.concepts]") O, [nothrow-sentinel-for](#concept:nothrow-sentinel-for "26.11.2Special memory concepts[special.mem.concepts]")<O> S>
requires [constructible_from](concept.constructible#concept:constructible_from "18.4.11Concept constructible_­from[concept.constructible]")<iter_value_t<O>, iter_rvalue_reference_t<I>>
constexpr uninitialized_move_n_result<I, O>
uninitialized_move_n(I ifirst, iter_difference_t<I> n, O ofirst, S olast);
}
`
[8](#uninitialized.move-8)
[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/algorithms.tex#L14076)
*Preconditions*: [ofirst, olast) does not overlap with ifirst+[0, n)[.](#uninitialized.move-8.sentence-1)
[9](#uninitialized.move-9)
[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/algorithms.tex#L14080)
*Effects*: Equivalent to:auto t = uninitialized_move(counted_iterator(std::move(ifirst), n),
default_sentinel, ofirst, olast);return {std::move(t.in).base(), t.out};
[10](#uninitialized.move-10)
[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/algorithms.tex#L14089)
[*Note [2](#uninitialized.move-note-2)*:
If an exception is thrown, some objects in the rangeifirst+[0, n) are left in a valid but unspecified state[.](#uninitialized.move-10.sentence-1)
— *end note*]
### [26.11.7](#uninitialized.fill) uninitialized_fill [[uninitialized.fill]](uninitialized.fill)
[🔗](#lib:uninitialized_fill)
`template<class NoThrowForwardIterator, class T>
constexpr void uninitialized_fill(NoThrowForwardIterator first,
NoThrowForwardIterator last, const T& x);
`
[1](#uninitialized.fill-1)
[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/algorithms.tex#L14107)
*Effects*: Equivalent to:for (; first != last; ++first)::new (*voidify*(*first))typename iterator_traits<NoThrowForwardIterator>::value_type(x);
[🔗](#lib:uninitialized_fill_)
`namespace ranges {
template<[nothrow-forward-iterator](#concept:nothrow-forward-iterator "26.11.2Special memory concepts[special.mem.concepts]") I, [nothrow-sentinel-for](#concept:nothrow-sentinel-for "26.11.2Special memory concepts[special.mem.concepts]")<I> S, class T>
requires [constructible_from](concept.constructible#concept:constructible_from "18.4.11Concept constructible_­from[concept.constructible]")<iter_value_t<I>, const T&>
constexpr I uninitialized_fill(I first, S last, const T& x);
template<[nothrow-forward-range](#concept:nothrow-forward-range "26.11.2Special memory concepts[special.mem.concepts]") R, class T>
requires [constructible_from](concept.constructible#concept:constructible_from "18.4.11Concept constructible_­from[concept.constructible]")<range_value_t<R>, const T&>
constexpr borrowed_iterator_t<R> uninitialized_fill(R&& r, const T& x);
}
`
[2](#uninitialized.fill-2)
[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/algorithms.tex#L14130)
*Effects*: Equivalent to:for (; first != last; ++first)::new (*voidify*(*first)) remove_reference_t<iter_reference_t<I>>(x);return first;
[🔗](#lib:uninitialized_fill_n)
`template<class NoThrowForwardIterator, class Size, class T>
constexpr NoThrowForwardIterator
uninitialized_fill_n(NoThrowForwardIterator first, Size n, const T& x);
`
[3](#uninitialized.fill-3)
[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/algorithms.tex#L14148)
*Effects*: Equivalent to:for (; n--; ++first)::new (*voidify*(*first))typename iterator_traits<NoThrowForwardIterator>::value_type(x);return first;
[🔗](#lib:uninitialized_fill_n_)
`namespace ranges {
template<[nothrow-forward-iterator](#concept:nothrow-forward-iterator "26.11.2Special memory concepts[special.mem.concepts]") I, class T>
requires [constructible_from](concept.constructible#concept:constructible_from "18.4.11Concept constructible_­from[concept.constructible]")<iter_value_t<I>, const T&>
constexpr I uninitialized_fill_n(I first, iter_difference_t<I> n, const T& x);
}
`
[4](#uninitialized.fill-4)
[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/algorithms.tex#L14169)
*Effects*: Equivalent to:return uninitialized_fill(counted_iterator(first, n), default_sentinel, x).base();
### [26.11.8](#specialized.construct) construct_at [[specialized.construct]](specialized.construct)
[🔗](#lib:construct_at)
`template<class T, class... Args>
constexpr T* construct_at(T* location, Args&&... args);
namespace ranges {
template<class T, class... Args>
constexpr T* construct_at(T* location, Args&&... args);
}
`
[1](#specialized.construct-1)
[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/algorithms.tex#L14191)
*Constraints*: is_unbounded_array_v<T> is false[.](#specialized.construct-1.sentence-1)
The expression ::new (declval<void*>()) T(declval<Args>()...) is well-formed when treated as an unevaluated operand ([[expr.context]](expr.context#term.unevaluated.operand "7.2.3Context dependence"))[.](#specialized.construct-1.sentence-2)
[2](#specialized.construct-2)
[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/algorithms.tex#L14197)
*Mandates*: If is_array_v<T> is true, sizeof...(Args) is zero[.](#specialized.construct-2.sentence-1)
[3](#specialized.construct-3)
[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/algorithms.tex#L14201)
*Effects*: Equivalent to:if constexpr (is_array_v<T>)return ::new (*voidify*(*location)) T[1]();elsereturn ::new (*voidify*(*location)) T(std::forward<Args>(args)...);
### [26.11.9](#specialized.destroy) destroy [[specialized.destroy]](specialized.destroy)
[🔗](#lib:destroy_at)
`template<class T>
constexpr void destroy_at(T* location);
namespace ranges {
template<[destructible](concept.destructible#concept:destructible "18.4.10Concept destructible[concept.destructible]") T>
constexpr void destroy_at(T* location) noexcept;
}
`
[1](#specialized.destroy-1)
[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/algorithms.tex#L14225)
*Effects*:
- [(1.1)](#specialized.destroy-1.1)
If T is an array type, equivalent to destroy(begin(*location), end(*location))[.](#specialized.destroy-1.1.sentence-1)
- [(1.2)](#specialized.destroy-1.2)
Otherwise, equivalent to location->~T()[.](#specialized.destroy-1.2.sentence-1)
[🔗](#lib:destroy)
`template<class NoThrowForwardIterator>
constexpr void destroy(NoThrowForwardIterator first, NoThrowForwardIterator last);
`
[2](#specialized.destroy-2)
[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/algorithms.tex#L14242)
*Effects*: Equivalent to:for (; first != last; ++first) destroy_at(addressof(*first));
[🔗](#lib:destroy_)
`namespace ranges {
template<[nothrow-input-iterator](#concept:nothrow-input-iterator "26.11.2Special memory concepts[special.mem.concepts]") I, [nothrow-sentinel-for](#concept:nothrow-sentinel-for "26.11.2Special memory concepts[special.mem.concepts]")<I> S>
requires [destructible](concept.destructible#concept:destructible "18.4.10Concept destructible[concept.destructible]")<iter_value_t<I>>
constexpr I destroy(I first, S last) noexcept;
template<[nothrow-input-range](#concept:nothrow-input-range "26.11.2Special memory concepts[special.mem.concepts]") R>
requires [destructible](concept.destructible#concept:destructible "18.4.10Concept destructible[concept.destructible]")<range_value_t<R>>
constexpr borrowed_iterator_t<R> destroy(R&& r) noexcept;
}
`
[3](#specialized.destroy-3)
[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/algorithms.tex#L14264)
*Effects*: Equivalent to:for (; first != last; ++first) destroy_at(addressof(*first));return first;
[🔗](#lib:destroy_n)
`template<class NoThrowForwardIterator, class Size>
constexpr NoThrowForwardIterator destroy_n(NoThrowForwardIterator first, Size n);
`
[4](#specialized.destroy-4)
[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/algorithms.tex#L14281)
*Effects*: Equivalent to:for (; n > 0; (void)++first, --n) destroy_at(addressof(*first));return first;
[🔗](#lib:destroy_n_)
`namespace ranges {
template<[nothrow-input-iterator](#concept:nothrow-input-iterator "26.11.2Special memory concepts[special.mem.concepts]") I>
requires [destructible](concept.destructible#concept:destructible "18.4.10Concept destructible[concept.destructible]")<iter_value_t<I>>
constexpr I destroy_n(I first, iter_difference_t<I> n) noexcept;
}
`
[5](#specialized.destroy-5)
[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/algorithms.tex#L14301)
*Effects*: Equivalent to:return destroy(counted_iterator(std::move(first), n), default_sentinel).base();

View File

@@ -0,0 +1,43 @@
[specialized.algorithms.general]
# 26 Algorithms library [[algorithms]](./#algorithms)
## 26.11 Specialized <memory> algorithms [[specialized.algorithms]](specialized.algorithms#general)
### 26.11.1 General [specialized.algorithms.general]
[1](#1)
[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/algorithms.tex#L13503)
The contents specified in [[specialized.algorithms]](specialized.algorithms "26.11Specialized <memory> algorithms") are declared in the header [<memory>](memory.syn#header:%3cmemory%3e "20.2.2Header <memory> synopsis[memory.syn]")[.](#1.sentence-1)
[2](#2)
[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/algorithms.tex#L13507)
Unless otherwise specified,
if an exception is thrown in the following algorithms,
objects constructed by a placement [*new-expression*](expr.new#nt:new-expression "7.6.2.8New[expr.new]") ([[expr.new]](expr.new "7.6.2.8New"))
are destroyed in an unspecified order
before allowing the exception to propagate[.](#2.sentence-1)
[3](#3)
[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/algorithms.tex#L13514)
[*Note [1](#note-1)*:
When new objects are created by
the algorithms specified in [[specialized.algorithms]](specialized.algorithms "26.11Specialized <memory> algorithms"),
the lifetime ends for any existing objects
(including potentially-overlapping subobjects [[intro.object]](intro.object "6.8.2Object model"))
in storage that is reused [[basic.life]](basic.life "6.8.4Lifetime")[.](#3.sentence-1)
— *end note*]
[4](#4)
[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/algorithms.tex#L13523)
Some algorithms specified in [[specialized.algorithms]](specialized.algorithms "26.11Specialized <memory> algorithms") make use of the following exposition-only function templates:template<class T>constexpr void* *voidify*(T& obj) noexcept {return addressof(obj); }template<class I>decltype(auto) *deref-move*(I& it) {if constexpr (is_lvalue_reference_v<decltype(*it)>)return std::move(*it); elsereturn *it; }

View File

@@ -0,0 +1,38 @@
[specialized.construct]
# 26 Algorithms library [[algorithms]](./#algorithms)
## 26.11 Specialized <memory> algorithms [[specialized.algorithms]](specialized.algorithms#specialized.construct)
### 26.11.8 construct_at [specialized.construct]
[🔗](#lib:construct_at)
`template<class T, class... Args>
constexpr T* construct_at(T* location, Args&&... args);
namespace ranges {
template<class T, class... Args>
constexpr T* construct_at(T* location, Args&&... args);
}
`
[1](#1)
[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/algorithms.tex#L14191)
*Constraints*: is_unbounded_array_v<T> is false[.](#1.sentence-1)
The expression ::new (declval<void*>()) T(declval<Args>()...) is well-formed when treated as an unevaluated operand ([[expr.context]](expr.context#term.unevaluated.operand "7.2.3Context dependence"))[.](#1.sentence-2)
[2](#2)
[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/algorithms.tex#L14197)
*Mandates*: If is_array_v<T> is true, sizeof...(Args) is zero[.](#2.sentence-1)
[3](#3)
[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/algorithms.tex#L14201)
*Effects*: Equivalent to:if constexpr (is_array_v<T>)return ::new (*voidify*(*location)) T[1]();elsereturn ::new (*voidify*(*location)) T(std::forward<Args>(args)...);

View File

@@ -0,0 +1,88 @@
[specialized.destroy]
# 26 Algorithms library [[algorithms]](./#algorithms)
## 26.11 Specialized <memory> algorithms [[specialized.algorithms]](specialized.algorithms#specialized.destroy)
### 26.11.9 destroy [specialized.destroy]
[🔗](#lib:destroy_at)
`template<class T>
constexpr void destroy_at(T* location);
namespace ranges {
template<[destructible](concept.destructible#concept:destructible "18.4.10Concept destructible[concept.destructible]") T>
constexpr void destroy_at(T* location) noexcept;
}
`
[1](#1)
[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/algorithms.tex#L14225)
*Effects*:
- [(1.1)](#1.1)
If T is an array type, equivalent to destroy(begin(*location), end(*location))[.](#1.1.sentence-1)
- [(1.2)](#1.2)
Otherwise, equivalent to location->~T()[.](#1.2.sentence-1)
[🔗](#lib:destroy)
`template<class NoThrowForwardIterator>
constexpr void destroy(NoThrowForwardIterator first, NoThrowForwardIterator last);
`
[2](#2)
[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/algorithms.tex#L14242)
*Effects*: Equivalent to:for (; first != last; ++first) destroy_at(addressof(*first));
[🔗](#lib:destroy_)
`namespace ranges {
template<[nothrow-input-iterator](special.mem.concepts#concept:nothrow-input-iterator "26.11.2Special memory concepts[special.mem.concepts]") I, [nothrow-sentinel-for](special.mem.concepts#concept:nothrow-sentinel-for "26.11.2Special memory concepts[special.mem.concepts]")<I> S>
requires [destructible](concept.destructible#concept:destructible "18.4.10Concept destructible[concept.destructible]")<iter_value_t<I>>
constexpr I destroy(I first, S last) noexcept;
template<[nothrow-input-range](special.mem.concepts#concept:nothrow-input-range "26.11.2Special memory concepts[special.mem.concepts]") R>
requires [destructible](concept.destructible#concept:destructible "18.4.10Concept destructible[concept.destructible]")<range_value_t<R>>
constexpr borrowed_iterator_t<R> destroy(R&& r) noexcept;
}
`
[3](#3)
[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/algorithms.tex#L14264)
*Effects*: Equivalent to:for (; first != last; ++first) destroy_at(addressof(*first));return first;
[🔗](#lib:destroy_n)
`template<class NoThrowForwardIterator, class Size>
constexpr NoThrowForwardIterator destroy_n(NoThrowForwardIterator first, Size n);
`
[4](#4)
[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/algorithms.tex#L14281)
*Effects*: Equivalent to:for (; n > 0; (void)++first, --n) destroy_at(addressof(*first));return first;
[🔗](#lib:destroy_n_)
`namespace ranges {
template<[nothrow-input-iterator](special.mem.concepts#concept:nothrow-input-iterator "26.11.2Special memory concepts[special.mem.concepts]") I>
requires [destructible](concept.destructible#concept:destructible "18.4.10Concept destructible[concept.destructible]")<iter_value_t<I>>
constexpr I destroy_n(I first, iter_difference_t<I> n) noexcept;
}
`
[5](#5)
[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/algorithms.tex#L14301)
*Effects*: Equivalent to:return destroy(counted_iterator(std::move(first), n), default_sentinel).base();