Call signature
(since C++20)If T
is not an array type, calls the destructor of the object pointed to by p, as if by p->~T(). Otherwise, recursively destroys elements of *p in order, as if by calling std::destroy(std::begin(*p), std::end(*p)).
The function-like entities described on this page are algorithm function objects (informally known as niebloids), that is:
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{};[edit] Notes
destroy_at
deduces the type of object to be destroyed and hence avoids writing it explicitly in the destructor call.
When destroy_at
is called in the evaluation of some constant expression e, the argument p must point to an object whose lifetime began within the evaluation of e.
The following example demonstrates how to use ranges::destroy_at
to destroy a contiguous sequence of elements.
#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); }
Output:
0 destructed 1 destructed 2 destructed 3 destructed 4 destructed 5 destructed 6 destructed 7 destructed[edit] See also
RetroSearch is an open source project built by @garambo | Open a GitHub Issue
Search and Browse the WWW like it's 1997 | Search results from DuckDuckGo
HTML:
3.2
| Encoding:
UTF-8
| Version:
0.7.4