std::ranges::destroy_at
| Definiert in Header <memory>
|
||
| Aufrufsignatur |
||
template< std::destructible T >
constexpr void destroy_at( T* p ) noexcept;
|
(seit C++20) | |
Falls T kein Array-Typ ist, ruft den Destruktor des Objekts auf, auf das p zeigt, wie durch p->~T(). Andernfalls zerstört es rekursiv Elemente von *p in der Reihenfolge, als ob std::destroy(std::begin(*p), std::end(*p)) aufgerufen würde.
Die auf dieser Seite beschriebenen funktionsähnlichen Entitäten sind Algorithmus-Funktionsobjekte(informell bekannt als Niebloids), das heißt:
- Explizite Vorlagenargumentlisten können beim Aufruf einer von ihnen nicht angegeben werden.
- Keine von ihnen sind für argumentabhängige Suche sichtbar.
- Wenn eine von ihnen durch normale unqualifizierte Suche als der Name links vom Funktionsaufrufoperator gefunden wird, argumentabhängige Suche wird unterdrückt.
Parameter
| p | - | ein Zeiger auf das zu zerstörende Objekt |
Mögliche Implementierung
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{}; |
Hinweise
destroy_at
deduziert den Typ des zu zerstörenden Objekts und vermeidet somit, ihn explizit im Destruktoraufruf anzugeben.
Wenn
destroy_at
in der Auswertung eines
konstanten Ausdrucks
e
aufgerufen wird, muss das Argument
p
auf ein Objekt zeigen, dessen Lebensdauer innerhalb der Auswertung von
e
begann.
Beispiel
Zeigt, wie man ranges::destroy_at verwendet, um eine zusammenhängende Folge von Elementen zu zerstören.
#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);
}
Ausgabe:
0 destructed
1 destructed
2 destructed
3 destructed
Siehe auch
(C++20) |
zerstört eine Reihe von Objekten (Algorithmus-Funktionsobjekt) |
(C++20) |
zerstört eine Anzahl von Objekten in einem Bereich (Algorithmus-Funktionsobjekt) |
(C++20) |
erstellt ein Objekt an einer gegebenen Adresse (Algorithmus-Funktionsobjekt) |
(C++17) |
zerstört ein Objekt an einer gegebenen Adresse (Funktionsvorlage) |