std::ranges:: uninitialized_default_construct_n
|
Definiert im Header
<memory>
|
||
|
Aufrufsignatur
|
||
|
template
<
no-throw-forward-iterator
I
>
requires
std::
default_initializable
<
std::
iter_value_t
<
I
>>
|
(seit C++20)
(constexpr seit C++26) |
|
Konstruiert Objekte vom Typ
std::
iter_value_t
<
I
>
im nicht initialisierten Speicherbereich
first
+
[
0
,
count
)
durch
Default-Initialisierung
, als ob durch
return
ranges::
uninitialized_default_construct
(
std::
counted_iterator
(
first, count
)
,
std::
default_sentinel
)
.
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 | - | die Anzahl der zu konstruierenden Elemente |
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 Objektkonstruktion überspringen (ohne den beobachtbaren Effekt zu ändern), falls kein nicht-trivialer Standardkonstruktor beim Standard-Initialisieren eines std:: iter_value_t < I > -Objekts aufgerufen wird, was durch std::is_trivially_default_constructible erkannt werden kann.
Hinweise
| Feature-Test Makro | Wert | Std | Funktion |
|---|---|---|---|
__cpp_lib_raw_memory_algorithms
|
202411L
|
(C++26) | constexpr für spezialisierte Speicheralgorithmen |
Mögliche Implementierung
struct uninitialized_default_construct_n_fn { template<no-throw-forward-iterator I> requires std::default_initializable<std::iter_value_t<I>> constexpr I operator()(I first, std::iter_difference_t<I> count) const { auto iter = std::counted_iterator(first, count); return ranges::uninitialized_default_construct(iter, std::default_sentinel).base(); } }; inline constexpr uninitialized_default_construct_n_fn uninitialized_default_construct_n{}; |
Beispiel
#include <cstring> #include <iostream> #include <memory> #include <string> int main() { struct S { std::string m{"█▓▒░ █▓▒░ "}; }; constexpr int n{4}; alignas(alignof(S)) char out[n * sizeof(S)]; try { auto first{reinterpret_cast<S*>(out)}; auto last = std::ranges::uninitialized_default_construct_n(first, n); auto count{1}; for (auto it{first}; it != last; ++it) std::cout << count++ << ' ' << it->m << '\n'; std::ranges::destroy(first, last); } catch (...) { std::cout << "Exception!\n"; } // For scalar types, uninitialized_default_construct_n // generally does not zero-fill the given uninitialized memory area. constexpr int sample[]{1, 2, 3, 4, 5, 6}; int v[]{1, 2, 3, 4, 5, 6}; std::ranges::uninitialized_default_construct_n(std::begin(v), std::size(v)); if (std::memcmp(v, sample, sizeof(v)) == 0) { // Maybe undefined behavior, pending CWG 1997: // for (const int i : v) { std::cout << i << ' '; } for (const int i : sample) std::cout << i << ' '; } else std::cout << "Unspecified!"; std::cout << '\n'; }
Mögliche Ausgabe:
1 █▓▒░ █▓▒░ 2 █▓▒░ █▓▒░ 3 █▓▒░ █▓▒░ 4 █▓▒░ █▓▒░ 1 2 3 4 5 6
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
|
konstruiert Objekte durch
Default-Initialisierung
in einem nicht initialisierten Speicherbereich, definiert durch einen Bereich
(Algorithmus-Funktionsobjekt) |
|
|
konstruiert Objekte durch
Wert-Initialisierung
in einem nicht initialisierten Speicherbereich, definiert durch einen Bereich
(Algorithmus-Funktionsobjekt) |
|
|
konstruiert Objekte durch
Wert-Initialisierung
in einem nicht initialisierten Speicherbereich, definiert durch einen Start und eine Anzahl
(Algorithmus-Funktionsobjekt) |
|
|
konstruiert Objekte durch
Default-Initialisierung
in einem nicht initialisierten Speicherbereich, definiert durch einen Start und eine Anzahl
(Funktions-Template) |