std::ranges::destroy_at
| Défini dans l'en-tête <memory>
|
||
| Signature d'appel |
||
template< std::destructible T >
constexpr void destroy_at( T* p ) noexcept;
|
(depuis C++20) | |
Si T n'est pas un type tableau, appelle le destructeur de l'objet pointé par p, comme par p->~T(). Sinon, détruit récursivement les éléments de *p dans l'ordre, comme en appelant std::destroy(std::begin(*p), std::end(*p)).
Les entités de type fonction décrites sur cette page sont des objets fonctions algorithmiques (informellement appelés niebloïdes), c'est-à-dire :
- Les listes d'arguments de modèle explicites ne peuvent pas être spécifiées lors de l'appel de l'un d'entre eux.
- Aucun d'entre eux n'est visible par recherche dépendante des arguments.
- Lorsque l'un d'entre eux est trouvé par recherche non qualifiée normale comme le nom à gauche de l'opérateur d'appel de fonction, la recherche dépendante des arguments est inhibée.
Paramètres
| p | - | un pointeur vers l'objet à détruire |
Implémentation possible
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{}; |
Notes
destroy_at
déduit le type de l'objet à détruire et évite ainsi de l'écrire explicitement dans l'appel du destructeur.
Lorsque
destroy_at
est appelé dans l'évaluation d'une
expression constante
e
, l'argument
p
doit pointer vers un objet dont la durée de vie a commencé durant l'évaluation de
e
.
Exemple
Montre comment utiliser ranges::destroy_at pour détruire une séquence contiguë d'éléments.
#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);
}
Sortie :
0 destructed
1 destructed
2 destructed
3 destructed
Voir aussi
(C++20) |
détruit une plage d'objets (objet de fonction d'algorithme) |
(C++20) |
détruit un nombre d'objets dans une plage (objet de fonction d'algorithme) |
(C++20) |
crée un objet à une adresse donnée (objet de fonction d'algorithme) |
(C++17) |
détruit un objet à une adresse donnée (modèle de fonction) |