std::scoped_allocator_adaptor::construct
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, |
(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) |
(5) | (hasta C++20) | |
(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))>>.
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.
4) Equivalente a
construct(p, std::piecewise_construct, std::forward_as_tuple(std::forward<U>(x)), std::forward_as_tuple(std::forward<V>(y))) 5) Equivalente a
construct(p, std::piecewise_construct, std::forward_as_tuple(xy.first), std::forward_as_tuple(xy.second)) 6) Equivalente a
construct(p, std::piecewise_construct, std::forward_as_tuple(std::forward<U>(xy.first)), std::forward_as_tuple(std::forward<V>(xy.second))) 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) |
(hasta C++20) |
Construye un objeto en almacenamiento asignado. (función miembro pública de std::allocator )
|