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)
Défini dans l'en-tête <memory>
Signature d'appel
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 ) ;
(depuis C++20)
(constexpr depuis C++26)

Construit des objets de type std:: iter_value_t < I > dans la zone mémoire non initialisée first + [ 0 , count ) par initialisation par défaut , comme par return ranges:: uninitialized_default_construct ( std:: counted_iterator ( first, count ) ,
std:: default_sentinel ) . base ( ) ;

Si une exception est levée pendant l'initialisation, les objets déjà construits sont détruits dans un ordre non spécifié.

Les entités de type fonction décrites sur cette page sont des objets fonction d'algorithmes (informellement appelés niebloids ), c'est-à-dire :

Table des matières

Paramètres

first - le début de la plage d'éléments à initialiser
count - le nombre d'éléments à construire

Valeur de retour

Comme décrit ci-dessus.

Complexité

Linéaire en count .

Exceptions

Toute exception levée lors de la construction des éléments dans la plage de destination.

Notes

Une implémentation peut omettre la construction des objets (sans modifier l'effet observable) si aucun constructeur par défaut non trivial n'est appelé lors de l'initialisation par défaut d'un std:: iter_value_t < I > objet, ce qui peut être détecté par std::is_trivially_default_constructible .

Notes

Macro de test de fonctionnalité Valeur Std Fonctionnalité
__cpp_lib_raw_memory_algorithms 202411L (C++26) constexpr pour les algorithmes de mémoire spécialisés

Implémentation possible

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{};

Exemple

#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";
    }
    // Pour les types scalaires, uninitialized_default_construct_n
    // ne remplit généralement pas de zéros la zone mémoire non initialisée donnée.
    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)
    {
        // Comportement potentiellement indéfini, en attente de CWG 1997 :
        // for (const int i : v) { std::cout << i << ' '; }
        for (const int i : sample)
            std::cout << i << ' ';
    }
    else
        std::cout << "Non spécifié !";
    std::cout << '\n';
}

Sortie possible :

1 █▓▒░ █▓▒░
2 █▓▒░ █▓▒░
3 █▓▒░ █▓▒░
4 █▓▒░ █▓▒░
1 2 3 4 5 6

Rapports de défauts

Les rapports de défauts modifiant le comportement suivants ont été appliqués rétroactivement aux normes C++ précédemment publiées.

DR Applicable à Comportement publié Comportement corrigé
LWG 3870 C++20 cet algorithme pourrait créer des objets sur un stockage const maintenu interdit

Voir aussi

construit des objets par default-initialization dans une zone de mémoire non initialisée, définie par une plage
(objet fonction algorithme)
construit des objets par value-initialization dans une zone de mémoire non initialisée, définie par une plage
(objet fonction algorithme)
construit des objets par value-initialization dans une zone de mémoire non initialisée, définie par un début et un compte
(objet fonction algorithme)
construit des objets par default-initialization dans une zone de mémoire non initialisée, définie par un début et un compte
(modèle de fonction)