|
| |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
Defined in header <memory> | ||
Call signature | ||
template<no-throw-forward-range I,class T> requiresstd::constructible_from<std::iter_value_t<I>,const T&> | (since C++20) (constexpr since C++26) | |
Copiesvalue to an uninitialized memory areafirst + [0, count) as if byreturnranges::uninitialized_fill(std::counted_iterator(first, count),
std::default_sentinel, value).base();
If an exception is thrown during the initialization, the objects already constructed are destroyed in an unspecified order.
The function-like entities described on this page arealgorithm function objects (informally known asniebloids), that is:
Contents |
| first | - | the beginning of the range of the elements to initialize |
| count | - | number of elements to construct |
| value | - | the value to construct the elements with |
As described above.
Linear incount.
Any exception thrown on construction of the elements in the destination range.
An implementation may improve the efficiency of theranges::uninitialized_fill_n, e.g. by usingranges::fill_n, if the value type of the output range isTrivialType.
| Feature-test macro | Value | Std | Feature |
|---|---|---|---|
__cpp_lib_raw_memory_algorithms | 202411L | (C++26) | constexpr forspecialized memory algorithms |
struct uninitialized_fill_n_fn{template<no-throw-forward-range I,class T> requiresstd::constructible_from<std::iter_value_t<I>,const T&> I operator()(I first,std::iter_difference_t<I> n,const T& x)const{ I rollback{first};try{for(; n-->0;++first)ranges::construct_at(std::addressof(*first), x);return first;}catch(...)// rollback: destroy constructed elements{for(; rollback!= first;++rollback)ranges::destroy_at(std::addressof(*rollback));throw;}}}; inlineconstexpr uninitialized_fill_n_fn uninitialized_fill_n{}; |
#include <iostream>#include <memory>#include <string> int main(){constexprint n{3}; alignas(alignof(std::string))char out[n* sizeof(std::string)]; try{auto first{reinterpret_cast<std::string*>(out)};auto last= std::ranges::uninitialized_fill_n(first, n,"cppreference"); for(auto it{first}; it!= last;++it)std::cout<<*it<<'\n'; std::ranges::destroy(first, last);}catch(...){std::cout<<"Exception!\n";}}
Output:
cppreferencecppreferencecppreference
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 |
(C++20) | copies an object to an uninitialized area of memory, defined by a range (algorithm function object)[edit] |
| copies an object to an uninitialized area of memory, defined by a start and a count (function template)[edit] |