|
|
Defined in header <memory> | ||
template<class NoThrowForwardIt,class Size> NoThrowForwardIt uninitialized_value_construct_n | (1) | (since C++17) (constexpr since C++26) |
template<class ExecutionPolicy,class NoThrowForwardIt,class Size> NoThrowForwardIt uninitialized_value_construct_n | (2) | (since C++17) |
+
[
0,
count)
byvalue-initialization, as if byfor(; count>0;(void)++first,--count)
::new(voidify
(*first))
typenamestd::iterator_traits<NoThrowForwardIt>::value_type();
return first;
std::is_execution_policy_v<std::decay_t<ExecutionPolicy>> istrue. | (until C++20) |
std::is_execution_policy_v<std::remove_cvref_t<ExecutionPolicy>> istrue. | (since C++20) |
Contents |
first | - | the beginning of the range of elements to initialize |
count | - | the number of elements to initialize |
policy | - | theexecution policy to use |
Type requirements | ||
-NoThrowForwardIt must meet the requirements ofLegacyForwardIterator. | ||
-No increment, assignment, comparison, or indirection through valid instances ofNoThrowForwardIt may throw exceptions. |
As described above.
Linear incount.
The overload with a template parameter namedExecutionPolicy
reports errors as follows:
ExecutionPolicy
is one of thestandard policies,std::terminate is called. For any otherExecutionPolicy
, the behavior is implementation-defined.Feature-test macro | Value | Std | Feature |
---|---|---|---|
__cpp_lib_raw_memory_algorithms | 202411L | (C++26) | constexpr forspecialized memory algorithms,(1) |
template<class NoThrowForwardIt,class Size>constexpr ForwardIt uninitialized_value_construct_n(NoThrowForwardIt first, Size count){using T=typenamestd::iterator_traits<NoThrowForwardIt>::value_type; NoThrowForwardIt current= first; try{for(; countn>0;(void)++current,--count)::new(static_cast<void*>(std::addressof(*current))) T();return current;}catch(...){std::destroy(first, current);throw;}} |
#include <iostream>#include <memory>#include <string> int main(){struct S{std::string m{"Default value"};}; constexprint n{3}; alignas(alignof(S))unsignedchar mem[n* sizeof(S)]; try{auto first{reinterpret_cast<S*>(mem)};auto last= std::uninitialized_value_construct_n(first, n); for(auto it{first}; it!= last;++it)std::cout<< it->m<<'\n'; std::destroy(first, last);}catch(...){std::cout<<"Exception!\n";} // For scalar types, uninitialized_value_construct_n// zero-initializes the given uninitialized memory area.int v[]{1,2,3,4};for(constint i: v)std::cout<< i<<' ';std::cout<<'\n'; std::uninitialized_value_construct_n(std::begin(v),std::size(v));for(constint i: v)std::cout<< i<<' ';std::cout<<'\n';}
Output:
Default valueDefault valueDefault value1 2 3 40 0 0 0
The following behavior-changing defect reports were applied retroactively to previously published C++ standards.
DR | Applied to | Behavior as published | Correct behavior |
---|---|---|---|
LWG 3870 | C++20 | this algorithm might create objects on aconst storage | kept disallowed |
constructs objects byvalue-initialization in an uninitialized area of memory, defined by a range (function template)[edit] | |
constructs objects bydefault-initialization in an uninitialized area of memory, defined by a start and a count (function template)[edit] | |
constructs objects byvalue-initialization in an uninitialized area of memory, defined by a start and a count (algorithm function object)[edit] |