std::destroy_n
Определено в заголовке <memory> |
||
|---|---|---|
| (1) | ||
template< class ForwardIt, class Size > ForwardIt destroy_n( ForwardIt first, Size n ); |
(с C++17) (до C++20) |
|
template< class ForwardIt, class Size > constexpr ForwardIt destroy_n( ForwardIt first, Size n ); |
(с C++20) | |
template< class ExecutionPolicy, class ForwardIt, class Size > ForwardIt destroy_n( ExecutionPolicy&& policy, ForwardIt first, Size n ); |
(2) | (с C++17) |
1) Уничтожает
n объекты в диапазоне, начинающемся с first, как если бы с помощью for (; n > 0; (void) ++first, --n)
std::destroy_at(std::addressof(*first));
2) То же, что и (1), но выполняется в соответствии с
policy. Этот перегруз не участвует в разрешении перегрузки, если |
|
(до C++20) |
|
|
(с C++20) |
Параметры
| first | - | начало диапазона элементов для уничтожения |
| n | - | количество элементов для уничтожения |
| policy | - | политика выполнения. Подробности см. в политике выполнения. |
| Требования к типу | ||
-ForwardIt должно соответствовать требованиям LegacyForwardIterator. |
||
-Ни увеличение, ни присваивание, ни сравнение, ни косвенное обращение к допустимым экземплярам ForwardIt не могут вызывать исключения. |
||
Возвращаемое значение
Конец диапазона объектов, которые были уничтожены (т.е., std::next(first, n)).
Сложность
Линейна по n.
Исключение
Перегрузка с параметром шаблона, названным ExecutionPolicy сообщает об ошибках следующим образом:
- Если выполнение функции, вызванной в рамках алгоритма, вызывает исключение, и
ExecutionPolicyявляется одной из стандартных политик, вызываетсяstd::terminate. Для любой другойExecutionPolicy, поведение определяется реализацией. - Если алгоритм не удается выделить память, выбрасывается
std::bad_alloc.
Возможная реализация
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;
} |
Пример
Следующий пример демонстрирует, как использовать destroy_n для уничтожения непрерывной последовательности элементов.
#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));
std::destroy_n(ptr, 8);
}Вывод:
0 destructed 1 destructed 2 destructed 3 destructed 4 destructed 5 destructed 6 destructed 7 destructed
См. также
|
(C++17) |
уничтожает диапазон объектов (шаблон функции) |
|
(C++17) |
уничтожает объект по заданному адресу (шаблон функции) |
|
(C++20) |
уничтожает определённое число объектов в диапазоне (niebloid) |
© cppreference.com
Licensed under the Creative Commons Attribution-ShareAlike Unported License v3.0.
https://en.cppreference.com/w/cpp/memory/destroy_n