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)
Definido en el encabezado <memory>
Firma de llamada
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 ) ;
(desde C++20)
(constexpr desde C++26)

Construye objetos de tipo std:: iter_value_t < I > en el área de memoria no inicializada first + [ 0 , count ) mediante inicialización por defecto , como si fuera mediante return ranges:: uninitialized_default_construct ( std:: counted_iterator ( first, count ) ,
std:: default_sentinel ) . base ( ) ;

Si se lanza una excepción durante la inicialización, los objetos ya construidos se destruyen en un orden no especificado.

Las entidades similares a funciones descritas en esta página son algorithm function objects (conocidas informalmente como niebloids ), es decir:

Contenidos

Parámetros

first - el inicio del rango de elementos a inicializar
count - el número de elementos a construir

Valor de retorno

Como se describió anteriormente.

Complejidad

Lineal en count .

Excepciones

Cualquier excepción lanzada durante la construcción de los elementos en el rango de destino.

Notas

Una implementación puede omitir la construcción de objetos (sin cambiar el efecto observable) si no se llama a ningún constructor por defecto no trivial al inicializar por defecto un objeto std:: iter_value_t < I > , lo cual puede detectarse mediante std::is_trivially_default_constructible .

Notas

Macro de prueba de características Valor Estándar Característica
__cpp_lib_raw_memory_algorithms 202411L (C++26) constexpr para algoritmos de memoria especializados

Implementación posible

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

Ejemplo

#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";
    }
    // Para tipos escalares, uninitialized_default_construct_n
    // generalmente no rellena con ceros el área de memoria no inicializada dada.
    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)
    {
        // Comportamiento posiblemente indefinido, pendiente de CWG 1997:
        // for (const int i : v) { std::cout << i << ' '; }
        for (const int i : sample)
            std::cout << i << ' ';
    }
    else
        std::cout << "¡No especificado!";
    std::cout << '\n';
}

Salida posible:

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

Informes de defectos

Los siguientes informes de defectos que modifican el comportamiento se aplicaron retroactivamente a los estándares de C++ publicados anteriormente.

DR Aplicado a Comportamiento publicado Comportamiento correcto
LWG 3870 C++20 este algoritmo podría crear objetos en un almacenamiento const se mantiene no permitido

Véase también

construye objetos mediante default-initialization en un área de memoria no inicializada, definida por un rango
(objeto función de algoritmo)
construye objetos mediante value-initialization en un área de memoria no inicializada, definida por un rango
(objeto función de algoritmo)
construye objetos mediante value-initialization en un área de memoria no inicializada, definida por un inicio y un contador
(objeto función de algoritmo)
construye objetos mediante default-initialization en un área de memoria no inicializada, definida por un inicio y un contador
(plantilla de función)