std::destroy_n - cppreference.com (original) (raw)
Destroys the n objects in the range starting at first, as if by
Same as (1), but executed according to policy. This overload participates in overload resolution only if all following conditions are satisfied:
Contents
- 1 Parameters
- 2 Return value
- 3 Complexity
- 4 Exceptions
- 5 Possible implementation
- 6 Example
- 7 See also
[edit] Parameters
| first | - | the beginning of the range of elements to destroy |
|---|---|---|
| n | - | the number of elements to destroy |
| policy | - | the execution policy to use |
| Type requirements | ||
| -ForwardIt must meet the requirements of LegacyForwardIterator. | ||
| -No increment, assignment, comparison, or indirection through valid instances of ForwardIt may throw exceptions. |
[edit] Return value
The end of the range of objects that has been destroyed (i.e., std::next(first, n)).
[edit] Complexity
Linear in n.
[edit] Exceptions
The overload with a template parameter named ExecutionPolicy reports errors as follows:
- If execution of a function invoked as part of the algorithm throws an exception and
ExecutionPolicyis one of the standard policies, std::terminate is called. For any otherExecutionPolicy, the behavior is implementation-defined. - If the algorithm fails to allocate memory, std::bad_alloc is thrown.
[edit] Possible implementation
template<class ForwardIt, class Size> constexpr // since C++20 ForwardIt destroy_n(ForwardIt first, Size n) { for (; n > 0; (void) ++first, --n) std::destroy_at(std::addressof(*first)); return first; }
[edit] Example
The following example demonstrates how to use destroy_n to destroy a contiguous sequence of elements.
#include #include #include 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)); std::destroy_n(ptr, 8); }
Output:
0 destructed 1 destructed 2 destructed 3 destructed 4 destructed 5 destructed 6 destructed 7 destructed