Namespaces
Variants

std::raw_storage_iterator

De es.cppreference.net
 
 
Biblioteca de gestión de memoria
Asignadores
Recursos de memoria
Almacenamiento no inicializado (hasta C++20*)
Soporte de recolector de basura (hasta C++23)
 
 
Definido en el encabezado <memory>
template< class OutputIt, class T >
class raw_storage_iterator
    : public std::iterator<std::output_iterator_tag, void, void, void, void>;
(hasta C++17)
template< class OutputIt, class T >
class raw_storage_iterator;
(desde C++17)
(obsoleto en C++17)
(eliminado en C++20)

El iterador de salida std::raw_storage_iterator permite a los algoritmos estándar almacenar resultados en memoria no inicializada. Cada vez que el algoritmo escribe un objeto de tipo T en el iterador desreferenciado, el objeto se construye por copia en la ubicación en el almacenamiento no inicializado apuntado por el iterador. El parámetro de plantilla OutputIt es cualquier tipo que cumpla los requisitos de LegacyOutputIterator y tenga operator* definido para devolver un objeto, para el cual operator& devuelve un objeto de tipo T*. Normalmente, el tipo T* se utiliza como OutputIt.

Requisitos de tipo

-
OutputIt debe cumplir con los requisitos de LegacyOutputIterator .

Funciones miembro

crea un nuevo raw_storage_iterator
(función miembro pública)
construye un objeto en la ubicación apuntada del búfer
(función miembro pública)
desreferencia el iterador
(función miembro pública)
avanza el iterador
(función miembro pública)
(since C++17)
proporciona acceso al iterador encapsulado
(función miembro pública)

Tipos de miembros

Tipo de miembro Definición
iterator_category std:: output_iterator_tag
value_type void
difference_type

void

(hasta C++20)

std::ptrdiff_t

(desde C++20)
pointer void
reference void

Los tipos de miembro iterator_category , value_type , difference_type , pointer y reference deben obtenerse heredando de std:: iterator < std:: output_iterator_tag , void , void , void , void > .

(hasta C++17)

Nota

std::raw_storage_iterator fue desaprobado principalmente debido a su comportamiento inseguro ante excepciones. A diferencia de std::uninitialized_copy , no maneja excepciones durante operaciones como std::copy de forma segura, lo que potencialmente puede conducir a fugas de recursos debido a la falta de seguimiento del número de objetos construidos exitosamente y su destrucción adecuada en presencia de excepciones.

Ejemplo

#include <algorithm>
#include <iostream>
#include <memory>
#include <string>
int main()
{
    const std::string s[] = {"This", "is", "a", "test", "."};
    std::string* p = std::allocator<std::string>().allocate(5);
    std::copy(std::begin(s), std::end(s),
              std::raw_storage_iterator<std::string*, std::string>(p));
    for (std::string* i = p; i != p + 5; ++i)
    {
        std::cout << *i << '\n';
        i->~basic_string<char>();
    }
    std::allocator<std::string>().deallocate(p, 5);
}

Salida:

This
is
a
test
.

Véase también

proporciona información sobre los tipos de asignador
(plantilla de clase)
implementa un asignador de múltiples niveles para contenedores de múltiples niveles
(plantilla de clase)
comprueba si el tipo especificado admite la construcción con uses-allocator
(plantilla de clase)
copia un rango de objetos a un área de memoria no inicializada
(plantilla de función, objeto función de algoritmo)&ranges::uninitialized_copy