std::ranges:: uninitialized_fill_n
|
Definiert in Header
<memory>
|
||
|
Aufrufsignatur
|
||
|
template
<
no-throw-forward-range
I,
class
T
>
requires
std::
constructible_from
<
std::
iter_value_t
<
I
>
,
const
T
&
>
|
(seit C++20)
(constexpr seit C++26) |
|
Kopiert
value
in einen nicht initialisierten Speicherbereich
first
+
[
0
,
count
)
wie durch
return
ranges::
uninitialized_fill
(
std::
counted_iterator
(
first, count
)
,
std::
default_sentinel
, value
)
.
base
(
)
;
Wenn während der Initialisierung eine Exception ausgelöst wird, werden die bereits konstruierten Objekte in einer nicht spezifizierten Reihenfolge zerstört.
Die auf dieser Seite beschriebenen funktionsähnlichen Entitäten sind algorithm function objects (informell bekannt als niebloids ), das heißt:
- Explizite Template-Argumentlisten können beim Aufruf keiner von ihnen angegeben werden.
- Keiner von ihnen ist sichtbar für argument-dependent lookup .
- Wenn einer von ihnen durch normal unqualified lookup als Name links vom Funktionsaufrufoperator gefunden wird, wird argument-dependent lookup unterdrückt.
Inhaltsverzeichnis |
Parameter
| first | - | der Anfang des Bereichs der zu initialisierenden Elemente |
| count | - | Anzahl der zu konstruierenden Elemente |
| value | - | der Wert, mit dem die Elemente konstruiert werden |
Rückgabewert
Wie oben beschrieben.
Komplexität
Linear in count .
Exceptions
Jede Ausnahme, die beim Konstruieren der Elemente im Zielbereich ausgelöst wird.
Hinweise
Eine Implementierung kann die Effizienz von
ranges::uninitialized_fill_n
verbessern, z.B. durch Verwendung von
ranges::fill_n
, wenn der Werttyp des Ausgabebereichs ein
TrivialType
ist.
| Feature-Test Makro | Wert | Std | Funktion |
|---|---|---|---|
__cpp_lib_raw_memory_algorithms
|
202411L
|
(C++26) | constexpr für spezialisierte Speicheralgorithmen |
Mögliche Implementierung
struct uninitialized_fill_n_fn { template<no-throw-forward-range I, class T> requires std::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: Zerstöre konstruierte Elemente { for (; rollback != first; ++rollback) ranges::destroy_at(std::addressof(*rollback)); throw; } } }; inline constexpr uninitialized_fill_n_fn uninitialized_fill_n{}; |
Beispiel
#include <iostream> #include <memory> #include <string> int main() { constexpr int 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"; } }
Ausgabe:
cppreference cppreference cppreference
Fehlerberichte
Die folgenden verhaltensändernden Fehlerberichte wurden rückwirkend auf zuvor veröffentlichte C++-Standards angewendet.
| DR | Angewendet auf | Verhalten wie veröffentlicht | Korrektes Verhalten |
|---|---|---|---|
| LWG 3870 | C++20 | dieser Algorithmus könnte Objekte auf einem const Speicher erstellen | weiterhin nicht erlaubt |
Siehe auch
|
(C++20)
|
kopiert ein Objekt in einen nicht initialisierten Speicherbereich, definiert durch einen Bereich
(Algorithmus-Funktionsobjekt) |
|
kopiert ein Objekt in einen nicht initialisierten Speicherbereich, definiert durch einen Startpunkt und eine Anzahl
(Funktionstemplate) |