std::destroy_n
Материал из cppreference.com
Определено в заголовочном файле <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. Эта перегрузка не участвует в разрешении перегрузки, если только
std::is_execution_policy_v<std::decay_t<ExecutionPolicy>> не равно true. |
(до C++20) |
std::is_execution_policy_v<std::remove_cvref_t<ExecutionPolicy>> не равно true. |
(начиная с 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 // начиная с 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 << " уничтожен\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}; //создаём объекты вручную auto ptr = std::launder(reinterpret_cast<Tracer*>(buffer)); std::destroy_n(ptr, 8); }
Вывод:
0 уничтожен 1 уничтожен 2 уничтожен 3 уничтожен 4 уничтожен 5 уничтожен 6 уничтожен 7 уничтожен
[править] Смотрите также
(C++17) |
уничтожает диапазон объектов (шаблон функции) |
(C++17) |
уничтожает объект по заданному адресу (шаблон функции) |
(C++20) |
уничтожает несколько объектов в диапазоне (ниблоид) |