std::uninitialized_copy
De es.cppreference.net
| Definido en el encabezado <memory>
|
||
template< class InputIt, class NoThrowForwardIt >
NoThrowForwardIt uninitialized_copy( InputIt first, InputIt last,
NoThrowForwardIt d_first );
|
(1) | (constexpr desde C++26) |
template< class ExecutionPolicy, class ForwardIt,
class NoThrowForwardIt >
NoThrowForwardIt uninitialized_copy( ExecutionPolicy&& policy,
ForwardIt first, ForwardIt last,
NoThrowForwardIt d_first );
|
(2) | (desde C++17) |
1) Construye elementos en el rango de destino comenzando en
d_first a partir de elementos en el rango de origen [first, last) como si por
for (; first != last; ++d_first, (void) ++first)
::new (voidify(*d_first))
typename std::iterator_traits<NoThrowForwardIt>::value_type(*first);
return d_first;
Si se lanza una excepción durante la inicialización, los objetos ya construidos se destruyen en un orden no especificado.
2) Igual que (1), pero ejecutado según
policy. Esta sobrecarga participa en la resolución de sobrecarga solo si el valor de la siguiente expresión es
true:
|
|
(hasta C++20) |
|
|
(desde C++20) |
|
Si |
(desde C++20) |
Parámetros
| first, last | - | el par de iteradores que define el rango de elementos a copiar |
| d_first | - | el inicio del rango de destino |
| policy | - | la política de ejecución a utilizar |
| Requisitos de tipo | ||
-
InputIt
debe cumplir con los requisitos de
LegacyInputIterator
.
|
||
-
ForwardIt
debe cumplir con los requisitos de
LegacyForwardIterator
.
|
||
-
NoThrowForwardIt
debe cumplir con los requisitos de
LegacyForwardIterator
.
|
||
-
NoThrowForwardIt
puede lanzar excepciones.
Aplicar
&
*
a un valor de
NoThrowForwardIt
debe producir un puntero a su tipo de valor.
(hasta C++11)
|
||
Valor de retorno
Como se ha descrito anteriormente.
Excepciones
2) Durante el proceso de ejecución:
- Si los recursos de memoria temporal necesarios para la paralelización no están disponibles, std::bad_alloc se lanza.
- Si se lanza una excepción no capturada al acceder a objetos a través de un argumento de algoritmo, el comportamiento está determinado por la política de ejecución (para políticas estándar, std::terminate es invocado).
Notas
| Prueba de característica macro | Valor | Std | Característica |
|---|---|---|---|
__cpp_lib_raw_memory_algorithms |
202411L |
(C++26) | constexpr para especializados <memory> algoritmos, (1)
|
Implementación posible
template<class InputIt, class NoThrowForwardIt> constexpr NoThrowForwardIt uninitialized_copy(InputIt first, InputIt last, NoThrowForwardIt d_first) { using T = typename std::iterator_traits<NoThrowForwardIt>::value_type; NoThrowForwardIt current = d_first; try { for (; first != last; ++first, (void) ++current) ::new (static_cast<void*>(std::addressof(*current))) T(*first); return current; } catch (...) { for (; d_first != current; ++d_first) d_first->~T(); throw; } } |
Ejemplo
Ejecutar este código
#include <cstdlib>
#include <iostream>
#include <memory>
#include <string>
int main()
{
const char* v[] = {"This", "is", "an", "example"};
auto sz = std::size(v);
if (void* pbuf = std::aligned_alloc(alignof(std::string), sizeof(std::string) * sz))
{
try
{
auto first = static_cast<std::string*>(pbuf);
auto last = std::uninitialized_copy(std::begin(v), std::end(v), first);
for (auto it = first; it != last; ++it)
std::cout << *it << '_';
std::cout << '\n';
std::destroy(first, last);
}
catch (...) {}
std::free(pbuf);
}
}
Salida:
This_is_an_example_
Informes de defectos
Los siguientes informes de defectos que modifican el comportamiento se aplicaron retroactivamente a los estándares C++ publicados anteriormente.
| DR | Aplicado a | Comportamiento publicado | Comportamiento correcto |
|---|---|---|---|
| LWG 866 | C++98 | dado T como el tipo de valor de NoThrowForwardIt, si T::operator new existe, el programa podría estar mal formado
|
utiliza el nuevo reemplazo global- new en su lugar |
| LWG 2133 | C++98 | la descripción del efecto utilizaba un for bucle con la expresión de iteración++d_first, ++first, lo que resultaen una búsqueda dependiente de argumentos de operator,
|
descarta el valor de un operando para deshabilitar esa ADL |
| LWG 2433 | C++11 | este algoritmo podría ser secuestrado por una sobrecarga de operator&
|
utiliza std::addressof |
Véase también
|
(C++11)
|
copia un número de objetos a un área de memoria no inicializada
(plantilla de función) |
|
(C++20)
|
copia un rango de objetos a un área de memoria no inicializada
(objeto función de algoritmo) |