std::ranges::uninitialized_move_n, std::ranges::uninitialized_move_n_result - cppreference.com

From cppreference.com

Defined in header

<memory>

Call signature

template<std::input_iteratorI,/*nothrow-forward-iterator*/O,/*nothrow-sentinel-for*/<O>S>requiresstd::constructible_from<std::iter_value_t<O>,std::iter_rvalue_reference_t<I>>uninitialized_move_n_result<I,O>uninitialized_move_n(Iifirst,std::iter_difference_t<I>count,Oofirst,Solast); (1)(since C++20)
(constexpr since C++26)template</*execution-policy*/Ep,std::random_access_iteratorI,/*nothrow-random-access-iterator*/O,/*nothrow-sized-sentinel-for*/<O>S>requiresstd::constructible_from<std::iter_value_t<O>,std::iter_rvalue_reference_t<I>>uninitialized_move_n_result<I,O>uninitialized_move_n(Ep&&policy,Iifirst,std::iter_difference_t<I>count,Oofirst,Solast); (2) (since C++26)Helper types

template<classI,classO>usinguninitialized_move_n_result=ranges::in_out_result<I,O>; (3) (since C++20)For the definition of /*execution-policy*/, see

this page

; for the definition of other exposition-only concepts, see

this page

.

1) Constructs elements in the destination range [ofirst, olast) from elements in the source range ifirst + [0, count) as if by

autoret=ranges::uninitialized_move(std::counted_iterator(std::move(ifirst),count),
std::default_sentinel,ofirst,olast);
return{std::move(ret.in).base(),ret.out};

If an exception is thrown during the initialization then the objects that already constructed in [ofirst, olast) are destroyed in an unspecified order. Also, the objects in the input range beginning at ifirst, that were already moved, are left in a valid but unspecified state.

If [ofirst, olast) overlaps with ifirst + [0, count), the behavior is undefined.

2) Same as (1), but executed according to policy.

The function-like entities described on this page are

algorithm function objects

(informally known as niebloids), that is:

Explicit template argument lists cannot be specified when calling any of them.

None of them are visible to

argument-dependent lookup

.

When any of them are found by

normal unqualified lookup

as the name to the left of the function-call operator,

argument-dependent lookup

is inhibited.

Parameters

ifirst - the beginning of the input range of elements to move from ofirst, olast - the iterator-sentinel pair defining the output

range

of elements to initialize count - the number of elements to move policy - the

execution policy

to use Return value

As described above.

Exceptions

Any exception thrown on construction of the elements in the destination range.

2) During the execution process:

If the temporary memory resources required for parallelization are not available,

std::bad_alloc

is thrown.

If an uncaught exception is thrown while accessing objects via an algorithm argument, the behavior is determined by the execution policy (for

standard policies

,

std::terminate

is invoked).

Notes

An implementation may improve the efficiency of the ranges::uninitialized_move_n (by using e.g.

ranges::copy_n

) if the value type of the output range is

TrivialType

.

Feature-test

macro ValueStdFeature

__cpp_lib_parallel_algorithm

202506L

(C++26)Parallel range algorithms

__cpp_lib_raw_memory_algorithms

202411L

(C++26)constexpr for

specialized <memory> algorithms

, (

1

)Possible implementation

structuninitialized_move_n_fn{template<std::input_iteratorI,/*nothrow-forward-iterator*/O,/*nothrow-sentinel-for*/<O>S>requiresstd::constructible_from<std::iter_value_t<O>,std::iter_rvalue_reference_t<I>>constexprranges::uninitialized_move_n_result<I,O>operator()(Iifirst,std::iter_difference_t<I>count,Oofirst,Solast)const{autoiter=std::counted_iterator(std::move(ifirst),count);autoret=ranges::uninitialized_move(iter,std::default_sentinel,ofirst,olast);return{std::move(ret.in).base(),ret.out};}};inlineconstexpruninitialized_move_n_fnuninitialized_move_n{};Example

Run this code

#include<cstdlib>#include<iomanip>#include<iostream>#include<memory>#include<string>voidprint(autorem,autofirst,autolast){for(std::cout<<rem;first!=last;++first)std::cout<<std::quoted(*first)<<' ';std::cout<<'\n';}intmain(){std::stringin[]{"No","Diagnostic","Required",};print("initially, in: ",std::begin(in),std::end(in));if(constexprautosz=std::size(in);void*out=std::aligned_alloc(alignof(std::string),sizeof(std::string)*sz)){try{autofirst{static_cast<std::string*>(out)};autolast{first+sz};std::ranges::uninitialized_move_n(std::begin(in),sz,first,last);print("after move, in: ",std::begin(in),std::end(in));print("after move, out: ",first,last);std::ranges::destroy(first,last);}catch(...){std::cout<<"Exception!\n";}std::free(out);}}Possible output:

initially, in: "No" "Diagnostic" "Required" after move, in: "" "" "" after move, out: "No" "Diagnostic" "Required" See also