Namespaces
Variants

std::ranges::destroy_at

De es.cppreference.net
 
 
Biblioteca de algoritmos
Algoritmos restringidos y algoritmos sobre rangos (C++20)
Algoritmos restringidos, por ejemplo ranges::copy, ranges::sort, ...
Operaciones de secuencia no modificadoras    
Operaciones por lotes
(C++17)
Operaciones de búsqueda
Operaciones de secuencia modificadoras
Operaciones de copia
(C++11)
(C++11)
Operaciones de intercambio
Operaciones de transformación
Operaciones de generación
Operaciones de eliminación
Operaciones de cambio de orden
(hasta C++17)(C++11)
(C++20)(C++20)
Operaciones de muestreo
(C++17)

Ordenamiento y operaciones relacionadas
Operaciones de particionamiento
(C++11)    

Operaciones de ordenamiento
Operaciones de búsqueda binaria
(en rangos particionados)
Operaciones de conjunto (en rangos ordenados)
Operaciones de fusión (en rangos ordenados)
Operaciones de montículo
Operaciones de mínimo/máximo
(C++11)
(C++17)
Operaciones de comparación lexicográfica
Operaciones de permutación


 
 
Definido en el encabezado <memory>
Firma de la llamada
template< std::destructible T >
constexpr void destroy_at( T* p ) noexcept;
(desde C++20)

Si T no es un tipo array, llama al destructor del objeto al que apunta p, como si se hiciera p->~T(). De lo contrario, destruye recursivamente los elementos de *p en orden, como si se llamara a std::destroy(std::begin(*p), std::end(*p)).

Las entidades similares a funciones descritas en esta página son objetos función de algoritmo (informalmente conocidos como niebloids), es decir:

Parámetros

p - un puntero al objeto que será destruido

Implementación posible

struct destroy_at_fn
{
    template<std::destructible T>
    constexpr void operator()(T* p) const noexcept
    {
        if constexpr (std::is_array_v<T>)
            for (auto& elem : *p)
                operator()(std::addressof(elem));
        else
            p->~T();
    }
};
inline constexpr destroy_at_fn destroy_at{};

Notas

destroy_at deduce el tipo de objeto que será destruido y por lo tanto evita escribirlo explícitamente en la llamada al destructor.

Cuando destroy_at es llamado en la evaluación de alguna expresión constante e , el argumento p debe apuntar a un objeto cuyo tiempo de vida comenzó dentro de la evaluación de e .

Ejemplo

Demuestra cómo usar ranges::destroy_at para destruir una secuencia contigua de elementos.

#include <iostream>
#include <memory>
#include <new>

struct Tracer
{
    int value;
    ~Tracer() { std::cout << value << " destructed\n"; }
};

int main()
{
    alignas(Tracer) unsigned char buffer[sizeof(Tracer) * 4];
    
    for (int i = 0; i < 4; ++i)
        new (buffer + sizeof(Tracer) * i) Tracer{i}; // manually construct objects

    auto ptr = std::launder(reinterpret_cast<Tracer*>(buffer));

    for (int i = 0; i < 4; ++i)
        std::ranges::destroy_at(ptr + i);
}

Salida:

0 destructed
1 destructed
2 destructed
3 destructed

Véase también

destruye un rango de objetos
(objeto función de algoritmo)
destruye un número de objetos en un rango
(objeto función de algoritmo)
crea un objeto en una dirección determinada
(objeto función de algoritmo)
destruye un objeto en una dirección determinada
(plantilla de función)