std::ranges::destroy_at
| 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:
- No se pueden especificar listas de argumentos de plantilla explícitas al llamar a ninguna de ellas.
- Ninguna de ellas es visible para la búsqueda dependiente de argumentos.
- Cuando alguna de ellas se encuentra mediante búsqueda normal no cualificada como el nombre a la izquierda del operador de llamada a función, se inhibe la búsqueda dependiente de argumentos.
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
(C++20) |
destruye un rango de objetos (objeto función de algoritmo) |
(C++20) |
destruye un número de objetos en un rango (objeto función de algoritmo) |
(C++20) |
crea un objeto en una dirección determinada (objeto función de algoritmo) |
(C++17) |
destruye un objeto en una dirección determinada (plantilla de función) |