|
|
Defined in header <memory> | ||
template<class NoThrowForwardIt,class Size> NoThrowForwardIt uninitialized_default_construct_n | (1) | (since C++17) (constexpr since C++26) |
template<class ExecutionPolicy,class NoThrowForwardIt,class Size> NoThrowForwardIt uninitialized_default_construct_n | (2) | (since C++17) |
+
[
0,
count)
bydefault-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 construct |
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 inn.
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_default_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 <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= std::uninitialized_default_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_default_construct_n// generally does not zero-initialize the given uninitialized memory area.int v[]{1,2,3,4};constint original[]{1,2,3,4}; std::uninitialized_default_construct_n(std::begin(v),std::size(v)); // An attempt to access v might be an 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?"un":"")<<"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 range (function template)[edit] | |
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 start and count (algorithm function object)[edit] |