|
|
Defined in header <memory> | ||
template<class InputIt,class Size,class NoThrowForwardIt> NoThrowForwardIt uninitialized_copy_n( InputIt first, Size count, | (1) | (since C++11) (constexpr since C++26) |
template<class ExecutionPolicy,class ForwardIt, class Size,class NoThrowForwardIt> | (2) | (since C++17) |
for(; count>0;++d_first,(void)++first,--count)
::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 | - | the beginning of the range of the elements to copy |
count | - | the number 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. |
Iterator to the element past the last element copied.
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 InputIt,class Size,class NoThrowForwardIt>constexpr NoThrowForwardIt uninitialized_copy_n(InputIt first, Size count, NoThrowForwardIt d_first){using T=typenamestd::iterator_traits<NoThrowForwardIt>::value_type; NoThrowForwardIt current= d_first;try{for(; count>0;++first,(void)++current,--count)::new(static_cast<void*>(std::addressof(*current))) T(*first);}catch(...){for(; d_first!= current;++d_first) d_first->~T();throw;}return current;} |
#include <algorithm>#include <iostream>#include <memory>#include <string>#include <tuple>#include <vector> int main(){std::vector<std::string> v={"This","is","an","example"}; std::string* p;std::size_t sz;std::tie(p, sz)=std::get_temporary_buffer<std::string>(v.size()); sz=std::min(sz, v.size()); std::uninitialized_copy_n(v.begin(), sz, p); for(std::string* i= p; i!= p+ sz;++i){std::cout<<*i<<' '; i->~basic_string<char>();}std::cout<<'\n'; std::return_temporary_buffer(p);}
Possible 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 2133 | C++98 | the effect description used afor loop with the iteration expression++d_first,++first,--count, which results in argument-dependent lookups ofoperator, | discards the value of one operand to disable those ADLs |
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 |
copies a range of objects to an uninitialized area of memory (function template)[edit] | |
(C++20) | copies a number of objects to an uninitialized area of memory (algorithm function object)[edit] |