std::ranges::uninitialized_default_construct_n - cppreference.com

From cppreference.com

Defined in header

<memory>

Call signature

template</*nothrow-forward-iterator*/I>requiresstd::default_initializable<std::iter_value_t<I>>Iuninitialized_default_construct_n(Ifirst,std::iter_difference_t<I>count); (1)(since C++20)
(constexpr since C++26)template</*execution-policy*/Ep,/*nothrow-random-access-iterator*/I>requiresstd::default_initializable<std::iter_value_t<I>>Iuninitialized_default_construct_n(Ep&&policy,Ifirst,std::iter_difference_t<I>count); (2) (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 + [0, count) by

default-initialization

as if by

returnranges::uninitialized_default_construct(std::counted_iterator(first,count),
std::default_sentinel).base();

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

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

first - the beginning of the range of elements to initialize count - the number of elements to construct 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 skip the objects construction (without changing the observable effect) if no non-trivial default constructor is called while default-initializing a std::iter_value_t<I> object, which can be detected by

std::is_trivially_default_constructible

.

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_default_construct_n_fn{template</*nothrow-forward-iterator*/I>requiresstd::default_initializable<std::iter_value_t<I>>constexprIoperator()(Ifirst,std::iter_difference_t<I>count)const{autoiter=std::counted_iterator(first,count);returnranges::uninitialized_default_construct(iter,std::default_sentinel).base();}};inlineconstexpruninitialized_default_construct_n_fnuninitialized_default_construct_n{};Example

Run this code

#include<cstring>#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=std::ranges::uninitialized_default_construct_n(first,n);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_default_construct_n// generally does not zero-fill the given uninitialized memory area.constexprintsample[]{1,2,3,4,5,6};intv[]{1,2,3,4,5,6};std::ranges::uninitialized_default_construct_n(std::begin(v),std::size(v));if(std::memcmp(v,sample,sizeof(v))==0){// Maybe undefined behavior, pending CWG 1997:// for (const int i : v) { std::cout << i << ' '; }for(constinti:sample)std::cout<<i<<' ';}elsestd::cout<<"Unspecified!";std::cout<<'\n';}Possible output:

1 █▓▒░ █▓▒░ 2 █▓▒░ █▓▒░ 3 █▓▒░ █▓▒░ 4 █▓▒░ █▓▒░ 1 2 3 4 5 6 See also