Namespaces
Variants

std::ranges:: uninitialized_default_construct_n

From cppreference.net
Memory management library
( exposition only* )
Allocators
Uninitialized memory algorithms
Constrained uninitialized memory algorithms
Memory resources
Uninitialized storage (until C++20)
( until C++20* )
( until C++20* )
( until C++20* )

Garbage collector support (until C++23)
(C++11) (until C++23)
(C++11) (until C++23)
(C++11) (until C++23)
(C++11) (until C++23)
(C++11) (until C++23)
(C++11) (until C++23)
Definiert im Header <memory>
Aufrufsignatur
template < no-throw-forward-iterator I >

requires std:: default_initializable < std:: iter_value_t < I >>
I uninitialized_default_construct_n ( I first,

std:: iter_difference_t < I > count ) ;
(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:

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)