|
|
Defined in header <memory> | ||
template<class NoThrowForwardIt> void uninitialized_default_construct( NoThrowForwardIt first, | (1) | (since C++17) (constexpr since C++26) |
template<class ExecutionPolicy,class NoThrowForwardIt> void uninitialized_default_construct( ExecutionPolicy&& policy, | (2) | (since C++17) |
[
first,
last)
bydefault-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_default_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 <cstring>#include <iostream>#include <memory>#include <string> struct S{std::string m{"Default value"};}; int main(){constexprint n{3}; alignas(alignof(S))unsignedchar mem[n* sizeof(S)]; try{auto first{reinterpret_cast<S*>(mem)};auto last{first+ n}; std::uninitialized_default_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_default_construct// generally does not zero-fill the given uninitialized memory area.int v[]{1,2,3,4};constint original[]{1,2,3,4}; std::uninitialized_default_construct(std::begin(v),std::end(v)); // Maybe undefined behavior, pending CWG 1997 to be resolved.// for (const int i : v)// std::cout << i << ' '; // The result is unspecified.std::cout<<(std::memcmp(v, original, sizeof(v))==0?"Unmodified\n":"Modified\n");}
Possible output:
Default valueDefault valueDefault valueUnmodified
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 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 range (function template)[edit] | |
constructs objects bydefault-initialization in an uninitialized area of memory, defined by a range (algorithm function object)[edit] |