Namespaces
Variants

std::ranges:: destroy_at

From cppreference.net
Memory management library
( exposition only* )
Allocators
Uninitialized memory algorithms
Constrained uninitialized memory algorithms
Memory resources
Uninitialized storage (until C++20)
( until C++20* )
( until C++20* )
( until C++20* )

Garbage collector support (until C++23)
(C++11) (until C++23)
(C++11) (until C++23)
(C++11) (until C++23)
(C++11) (until C++23)
(C++11) (until C++23)
(C++11) (until C++23)
Definido en el encabezado <memory>
Firma de 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 apuntado por p , como si fuera mediante 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 algorithm function objects (conocidas informalmente como niebloids ), es decir:

Contenidos

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

El siguiente 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) * 8];
    for (int i = 0; i != 8; ++i)
        new(buffer + sizeof(Tracer) * i) Tracer{i}; // manually construct objects
    auto ptr = std::launder(reinterpret_cast<Tracer*>(buffer));
    for (int i = 0; i != 8; ++i)
        std::ranges::destroy_at(ptr + i);
}

Salida:

0 destructed
1 destructed
2 destructed
3 destructed
4 destructed
5 destructed
6 destructed
7 destructed

Véase también

destruye un rango de objetos
(objeto función algoritmo)
destruye un número de objetos en un rango
(objeto función algoritmo)
crea un objeto en una dirección dada
(objeto función algoritmo)
(C++17)
destruye un objeto en una dirección dada
(plantilla de función)