|
|
Defined in header <memory> | ||
template<class InputIt,class NoThrowForwardIt> NoThrowForwardIt uninitialized_copy( InputIt first, InputIt last, | (1) | (constexpr since C++26) |
template<class ExecutionPolicy,class ForwardIt, class NoThrowForwardIt> | (2) | (since C++17) |
[
first,
last)
to an uninitialized memory area beginning atd_first as if byfor(; first!= last;++d_first,(void)++first)
::new(voidify
(*d_first))
typenamestd::iterator_traits<NoThrowForwardIt>::value_type(*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) |
Ifd_first | (since C++20) |
Contents |
first, last | - | the pair of iterators defining therange of elements to copy |
d_first | - | the beginning of the destination range |
policy | - | theexecution policy to use |
Type requirements | ||
-InputIt must meet the requirements ofLegacyInputIterator. | ||
-ForwardIt must meet the requirements ofLegacyForwardIterator. | ||
-NoThrowForwardIt must meet the requirements ofLegacyForwardIterator. | ||
-No increment, assignment, comparison, or indirection through valid instances ofNoThrowForwardIt may throw exceptions. Applying&* to aNoThrowForwardIt value must yield a pointer to its value type.(until C++11) |
Iterator to the element past the last element copied.
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 InputIt,class NoThrowForwardIt>constexpr NoThrowForwardIt uninitialized_copy(InputIt first, InputIt last, NoThrowForwardIt d_first){using T=typenamestd::iterator_traits<NoThrowForwardIt>::value_type; NoThrowForwardIt current= d_first;try{for(; first!= last;++first,(void)++current)::new(static_cast<void*>(std::addressof(*current))) T(*first);return current;}catch(...){for(; d_first!= current;++d_first) d_first->~T();throw;}} |
#include <cstdlib>#include <iostream>#include <memory>#include <string> int main(){constchar*v[]={"This","is","an","example"}; auto sz=std::size(v); if(void*pbuf=std::aligned_alloc(alignof(std::string), sizeof(std::string)* sz)){try{auto first=static_cast<std::string*>(pbuf);auto last= std::uninitialized_copy(std::begin(v),std::end(v), first); for(auto it= first; it!= last;++it)std::cout<<*it<<'_';std::cout<<'\n'; std::destroy(first, last);}catch(...){}std::free(pbuf);}}
Output:
This_is_an_example_
The following behavior-changing defect reports were applied retroactively to previously published C++ standards.
DR | Applied to | Behavior as published | Correct behavior |
---|---|---|---|
LWG 866 | C++98 | givenT as the value type ofNoThrowForwardIt , ifT::operator new exists, the program might be ill-formed | uses global replacement- new instead |
LWG 2133 | C++98 | the effect description used afor loop with the iteration expression++d_first,++first, which results in an argument-dependent lookup ofoperator, | discards the value of one operand to disable that ADL |
LWG 2433 | C++11 | this algorithm might be hijacked by overloadedoperator& | usesstd::addressof |
LWG 3870 | C++20 | this algorithm might create objects on aconst storage | kept disallowed |
(C++11) | copies a number of objects to an uninitialized area of memory (function template)[edit] |
(C++20) | copies a range of objects to an uninitialized area of memory (algorithm function object)[edit] |