std::ranges::uninitialized_value_construct - cppreference.com

From cppreference.com

Defined in header

<memory>

Call signature

template</*nothrow-forward-iterator*/I,/*nothrow-sentinel-for*/<I>S>requiresstd::default_initializable<std::iter_value_t<I>>Iuninitialized_value_construct(Ifirst,Slast); (1)(since C++20)
(constexpr since C++26)template</*nothrow-forward-range*/R>requiresstd::default_initializable<ranges::range_value_t<R>>ranges::borrowed_iterator_t<R>uninitialized_value_construct(R&&r); (2)(since C++20)
(constexpr since C++26)template</*execution-policy*/Ep,/*nothrow-random-access-iterator*/I,/*nothrow-sized-sentinel-for*/<I>S>requiresstd::default_initializable<std::iter_value_t<I>>Iuninitialized_value_construct(Ep&&policy,Ifirst,Slast); (3) (since C++26)template</*execution-policy*/Ep,/*nothrow-sized-random-access-range*/R>requiresstd::default_initializable<ranges::range_value_t<R>>ranges::borrowed_iterator_t<R>uninitialized_value_construct(Ep&&policy,R&&r); (4) (since C++26)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 [first, last) by

value-initialization

as if by

for(;first!=last;++first)
::new(

voidify

(*first))
std::remove_reference_t<std::iter_reference_t<I>>();
returnfirst;

If an exception is thrown during the initialization, the objects already constructed are destroyed in an unspecified order.

2) Same as (1), but uses r as the destination range.

3,4) Same as (1,2), 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

first, last - the iterator-sentinel pair defining the

range

of elements to value-initialize r - the

range

of the elements to value-initialize policy - the

execution policy

to use Return value

As described above.

Exceptions

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

3,4) 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_value_construct (by using e.g.

ranges::fill

) if the value type of the range is a

CopyAssignable

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,2

)Possible implementation

structuninitialized_value_construct_fn{template</*nothrow-forward-iterator*/I,/*nothrow-sentinel-for*/<I>S>requiresstd::value_initializable<std::iter_value_t<I>>constexprIoperator()(Ifirst,Slast)const{usingvalue_type=std::remove_reference_t<std::iter_reference_t<I>>;ifconstexpr(std::is_trivially_default_constructible_v<value_type>)returnranges::fill(first,last,ValueType());Irollback{first};try{for(;!(first==last);++first)::new(static_cast<void*>(std::addressof(*first)))value_type();returnfirst;}catch(...)// rollback: destroy constructed elements{for(;rollback!=first;++rollback)ranges::destroy_at(std::addressof(*rollback));throw;}}template</*nothrow-forward-range*/R>requiresstd::default_initializable<ranges::range_value_t<R>>constexprranges::borrowed_iterator_t<R>operator()(R&&r)const{return(*this)(ranges::begin(r),ranges::next(ranges::begin(r),ranges::end(r)));}};inlineconstexpruninitialized_value_construct_fnuninitialized_value_construct{};Example

Run this code

#include<iostream>#include<memory>#include<string>intmain(){structS{std::stringm{"▄▀▄▀▄▀▄▀"};};constexprintn{4};alignas(alignof(S))charout[n*sizeof(S)];try{autofirst{reinterpret_cast<S*>(out)};autolast{first+n};std::ranges::uninitialized_value_construct(first,last);autocount{1};for(autoit{first};it!=last;++it)std::cout<<count++<<' '<<it->m<<'\n';std::ranges::destroy(first,last);}catch(...){std::cout<<"Exception!\n";}// For scalar types, uninitialized_value_construct// zero-fills the given uninitialized memory area.intv[]{0,1,2,3};std::cout<<' ';for(constinti:v)std::cout<<' '<<static_cast<char>(i+'A');std::cout<<"\n ";std::ranges::uninitialized_value_construct(std::begin(v),std::end(v));for(constinti:v)std::cout<<' '<<static_cast<char>(i+'A');std::cout<<'\n';}Output:

1 ▄▀▄▀▄▀▄▀ 2 ▄▀▄▀▄▀▄▀ 3 ▄▀▄▀▄▀▄▀ 4 ▄▀▄▀▄▀▄▀ A B C D A A A A See also