std::ranges::destroy_n
Материал из cppreference.com
<tbody>
</tbody>
| Определено в заголовочном файле <memory>
|
||
| Сигнатура вызова |
||
template< итератор-ввода-без-исключения I > requires std::destructible<std::iter_value_t<I>> constexpr I destroy_n( I first, std::iter_difference_t<I> n ) noexcept; |
(начиная с C++20) | |
Уничтожает n объектов в диапазоне, начинающемся с first, что эквивалентно
return std::ranges::destroy(std::counted_iterator(first, n), std::default_sentinel).base();
Функционально-подобные объекты, описанные на этой странице, являются ниблоидами, то есть:
- Явные списки аргументов шаблона не могут быть указаны при вызове любого из них.
- Ни один из них не виден для поиска, зависящего от аргумента.
- Когда какой-либо из них обнаруживается обычным неквалифицированным поиском по имени слева от оператора вызова функции, поиск, зависящий от аргумента запрещён.
На практике они могут быть реализованы как функциональные объекты или со специальными расширениями компилятора.
Параметры
| first | — | начало диапазона элементов для уничтожения |
| n | — | количество элементов для уничтожения |
Возвращаемое значение
Конец диапазона уничтоженных объектов.
Сложность
Линейная по n.
Возможная реализация
struct destroy_n_fn
{
template<итератор-ввода-без-исключения I>
requires std::destructible<std::iter_value_t<I>>
constexpr I operator()(I first, std::iter_difference_t<I> n) const noexcept
{
for (; n != 0; (void)++first, --n)
std::ranges::destroy_at(std::addressof(*first));
return first;
}
};
inline constexpr destroy_n_fn destroy_n{};
|
Пример
В следующем примере показано, как использовать ranges::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::ranges::destroy_n(ptr, 8);
}
Вывод:
0 уничтожен
1 уничтожен
2 уничтожен
3 уничтожен
4 уничтожен
5 уничтожен
6 уничтожен
7 уничтожен
Смотрите также
(C++20) |
уничтожает объект по заданному адресу (ниблоид) |
(C++20) |
уничтожает диапазон объектов (ниблоид) |
(C++17) |
уничтожает несколько объектов в диапазоне (шаблон функции) |