|
|
Defined in header <memory> | ||
Call signature | ||
template<no-throw-forward-iterator I, no-throw-sentinel-for<I> S, class T> | (1) | (since C++20) (constexpr since C++26) |
template<no-throw-forward-range R,class T> requiresstd::constructible_from<ranges::range_value_t<R>, | (2) | (since C++20) (constexpr since C++26) |
[
first,
last)
as if byfor(; first!= last;++first)
::new(voidify(*first))std::remove_reference_t<std::iter_reference_t<I>>(value);
return first;
The function-like entities described on this page arealgorithm function objects (informally known asniebloids), that is:
Contents |
first, last | - | the iterator-sentinel pair defining therange of elements to initialize |
r | - | therange of the elements to initialize |
value | - | the value to construct the elements with |
As described above.
Linear in the size of the uninitialized memory area.
Any exception thrown on construction of the elements in the destination range.
An implementation may improve the efficiency of theranges::uninitialized_fill
, e.g. by usingranges::fill, 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,(1,2) |
struct uninitialized_fill_fn{template<no-throw-forward-iterator I, no-throw-sentinel-for<I> S,class T> requiresstd::constructible_from<std::iter_value_t<I>,const T&>constexpr I operator()(I first, S last,const T& value)const{ I rollback{first};try{for(;!(first== last);++first)ranges::construct_at(std::addressof(*first), value);return first;}catch(...){// rollback: destroy constructed elementsfor(; rollback!= first;++rollback)ranges::destroy_at(std::addressof(*rollback));throw;}} template<no-throw-forward-range R,class T> requiresstd::constructible_from<ranges::range_value_t<R>,const T&>constexprranges::borrowed_iterator_t<R> operator()(R&& r,const T& value)const{return(*this)(ranges::begin(r),ranges::end(r), value);}}; inlineconstexpr uninitialized_fill_fn uninitialized_fill{}; |
#include <iostream>#include <memory>#include <string> int main(){constexprint n{4}; alignas(alignof(std::string))char out[n* sizeof(std::string)]; try{auto first{reinterpret_cast<std::string*>(out)};auto last{first+ n}; std::ranges::uninitialized_fill(first, last,"▄▀▄▀▄▀▄▀"); int count{1};for(auto it{first}; it!= last;++it)std::cout<< count++<<' '<<*it<<'\n'; std::ranges::destroy(first, last);}catch(...){std::cout<<"Exception!\n";}}
Output:
1 ▄▀▄▀▄▀▄▀2 ▄▀▄▀▄▀▄▀3 ▄▀▄▀▄▀▄▀4 ▄▀▄▀▄▀▄▀
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 start and a count (algorithm function object)[edit] |
copies an object to an uninitialized area of memory, defined by a range (function template)[edit] |