|
|
Defined in header <memory> | ||
template<class NoThrowForwardIt> void uninitialized_value_construct( NoThrowForwardIt first, | (1) | (since C++17) (constexpr since C++26) |
template<class ExecutionPolicy,class NoThrowForwardIt> void uninitialized_value_construct( ExecutionPolicy&& policy, | (2) | (since C++17) |
[
first,
last)
byvalue-initialization, as if byfor(; first!= last;++first)
::new(voidify
(*first))
typenamestd::iterator_traits<NoThrowForwardIt>::value_type();
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, last | - | the pair of iterators defining therange 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. |
Linear in the distance betweenfirst andlast.
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>constexprvoid uninitialized_value_construct(NoThrowForwardIt first, NoThrowForwardIt last){using Value=typenamestd::iterator_traits<NoThrowForwardIt>::value_type; NoThrowForwardIt current= first;try{for(; current!= last;++current){::new(static_cast<void*>(std::addressof(*current))) Value();}}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{first+ n}; std::uninitialized_value_construct(first, last); 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// zero-fills 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(std::begin(v),std::end(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 start and a count (function template)[edit] | |
constructs objects bydefault-initialization in an uninitialized area of memory, defined by a range (function template)[edit] | |
constructs objects byvalue-initialization in an uninitialized area of memory, defined by a range (algorithm function object)[edit] |