Espacios de nombres
Variantes
Acciones

std::scoped_allocator_adaptor::construct

De cppreference.com
 
 
Gestión de memoria dinámica
Punteros inteligentes
(C++11)
(C++11)
(C++11)
(hasta C++17)
(C++11)
(C++23)
Asignadores de memoria
Recursos de memoria
Almacenamiento no inicializado
Algoritmos de memoria no inicializada
Algoritmos restringidos de memoria no inicializada
Apoyo para recolección de basura
(C++11)(hasta C++23)
(C++11)(hasta C++23)
(C++11)(hasta C++23)
(C++11)(hasta C++23)
(C++11)(hasta C++23)
(C++11)(hasta C++23)
Misceláneos
(C++20)
(C++11)
(C++11)
 
 
Definido en el archivo de encabezado <scoped_allocator>
template < class T, class... Args >
void construct( T* p, Args&&... args );
(1)
template< class T1, class T2, class... Args1, class... Args2 >

void construct( std::pair<T1, T2>* p,
                std::piecewise_construct_t,
                std::tuple<Args1...> x,

                std::tuple<Args2...> y );
(2) (hasta C++20)
template< class T1, class T2 >
void construct( std::pair<T1, T2>* p );
(3) (hasta C++20)
template< class T1, class T2, class U, class V >
void construct( std::pair<T1, T2>* p, U&& x, V&& y );
(4) (hasta C++20)
template< class T1, class T2, class U, class V >
void construct( std::pair<T1, T2>* p, const std::pair<U, V>& xy );
(5) (hasta C++20)
template< class T1, class T2, class U, class V >
void construct( std::pair<T1, T2>* p, std::pair<U, V>&& xy );
(6) (hasta C++20)
template< class T1, class T2, class NonPair >
void construct( std::pair<T1, T2>* p, NonPair&& non_pair );
(7) (hasta C++20)

Construye un objeto en almacenamiento asignado, pero no inicializado, al que apunta p usando OuterAllocator y los argumentos del constructor proporcionados. Si el objeto es del tipo que utiliza asignadores, o si es std::pair, pasa InnerAllocator al objeto construido.

Primero, recupera el asignador más externo MÁSEXTERNO llamando a this->outer_allocator(), y luego llama a la función miembro outer_allocator() recursivamente en el resultado de esta llamada hasta llegar a un asignador que no tiene tal función miembro.

Define RASGOS_DE_ASIGNADOR_MÁSEXTERNO(x) como std::allocator_traits<std::remove_reference_t<decltype(MÁSEXTERNO(x))>>.

1) Crea un objeto del tipo dado T mediante construcción con uso de asignador en la ubicación de memoria no inicializada indicada por p, usando MÁSEXTERNO como asignador. Después del ajuste para la convención de uso de asignador esperada por el constructor de T, llama a RASGOS_DE_ASIGNADOR_MÁSEXTERNO(*this)::construct.
Esta sobrecarga solo participa en la resolución de sobrecargas si U no es una especialización de std::pair.
(hasta C++20)
Equivalente a
std::apply(
    [p,this](auto&&... newargs) {
        RASGOS_DE_ASIGNADOR_MÁSEXTERNO(*this)::construct(
            MÁSEXTERNO(*this), p, std::forward<decltype(newargs)>(newargs)...);
    },
    std::uses_allocator_construction_args(
        inner_allocator(),
        std::forward<Args>(args)...
    )
);
(desde C++20)
2) Primero, si T1 o T2 es consciente de asignador, modifica las tuplas x e y para incluir el asignador interno adecuado, lo que da como resultado las dos nuevas tuplas xprime e yprime, según las siguientes tres reglas:
2a) si T1 no es consciente de asignador (std::uses_allocator<T1, inner_allocator_type>::value==false), entonces xprime es std::tuple<Args1&&...>(std::move(x)). (también se requiere que std::is_constructible<T1, Args1...>::value==true)
2b) si T1 es consciente de asignador (std::uses_allocator<T1, inner_allocator_type>::value==true), y su constructor toma una etiqueta de asignador (std::is_constructible<T1, std::allocator_arg_t, inner_allocator_type&, Args1...>::value==true), entonces xprime es
std::tuple_cat(std::tuple<std::allocator_arg_t, inner_allocator_type&>(
                    std::allocator_arg, inner_allocator()
               ),
               std::tuple<Args1&&...>(std::move(x)))
2c) si T1 es consciente de asignador (std::uses_allocator<T1, inner_allocator_type>::value==true), y su constructor toma el asignador como último argumento (std::is_constructible<T1, Args1..., inner_allocator_type&>::value==true), entonces xprime es std::tuple_cat(std::tuple<Args1&&...>(std::move(x)), std::tuple<inner_allocator_type&>(inner_allocator())).
Las mismas reglas se aplican a T2 y al reemplazo de y con yprime
Una vez que se construyen xprime e yprime, construye el par p en el almacenamiento asignado llamando a
std::allocator_traits<O>::construct( MÁSEXTERNO,
                                     p,
                                     std::piecewise_construct,
                                     std::move(xprime),
                                     std::move(yprime));
3) Equivalente a construct(p, std::piecewise_construct, std::tuple<>(), std::tuple<>()), es decir, pasa el asignador interno a los tipos miembro del par si los aceptan.
5) Equivalente a
6) Equivalente a
7) Esta sobrecarga solo participa en la resolución de sobrecargas si dada la plantilla de función de solo exposición
template< class A, class B >
void /*deducir-como-par*/( const std::pair<A, B>& );

, /*deducir-como-par*/(non_pair) está mal formado cuando se considera como un operando no evaluado. Equivalente a

construct<T1, T2, T1, T2>(p, std::forward<NonPair>(non_pair));
(hasta C++20)

Contenido

[editar] Parámetros

p - Puntero al almacenamiento asignado, pero no inicializado.
args... - Los argumentos del constructor a pasar al constructor de T.
x - Los argumentos del constructor a pasar al constructor de T1.
y - Los argumentos del constructor a pasar al constructor de T2.
xy - El std::pair cuyos dos miembros son los argumentos del constructor de T1 y T2.
non_pair - Argumento no std::pair a convertir a std::pair para construcción adicional.

[editar] Valor de retorno

(Ninguno)

[editar] Notas

Esta función se llama (a través de std::allocator_traits) por cualquier objeto consciente de asignador, como std::vector, que le fue dado un std::scoped_allocator_adaptor como el asignador a usar. Ya que inner_allocator es en sí mismo una instancia de std::scoped_allocator_adaptor, esta función también se llamará cuando los objetos conscientes de asignador construidos a través de esta función comiencen a construir sus propios miembros.

[editar] Informes de defectos

Los siguientes informes de defectos de cambio de comportamiento se aplicaron de manera retroactiva a los estándares de C++ publicados anteriormente.

ID Aplicado a Comportamiento según lo publicado Comportamiento correcto
LWG 2975 C++17 La primera sobrecarga se usaba erróneamente para la construcción de std::pair en algunos casos. Se restringió para que no aceptara std::pair.
P0475R1 C++11 La construcción de un std::pair pieza por pieza puede copiar los argumentos. Transformado a tuplas de referencias para evitar la copia.
LWG 3525 C++17 Ninguna sobrecarga podía manejar tipos no std::pair convertibles a std::pair. Se agregó una sobrecarga de reconstrucción.

[editar] Véase también

[estático]
construye un objeto en el almacenamiento asignado
Original:
constructs an object in the allocated storage
The text has been machine-translated via Google Translate.
You can help to correct and verify the translation. Click here for instructions.

(plantilla de función) [editar]
(hasta C++20)
Construye un objeto en almacenamiento asignado.
(función miembro pública de std::allocator) [editar]