Пространства имён
Варианты
Действия

std::ranges::destroy

Материал из cppreference.com
< cpp‎ | memory
 
 
Библиотека утилит
Языковая поддержка
Поддержка типов (базовые типы, RTTI)
Макросы тестирования функциональности библиотеки (C++20)    
Управление динамической памятью
Программные утилиты
Поддержка сопрограмм(C++20)
Вариативные функции
Трёхстороннее сравнение (C++20)
(C++20)
(C++20)(C++20)(C++20)(C++20)(C++20)(C++20)
Общие утилиты
Дата и время
Функциональные объекты
Библиотека форматирования(C++20)
(C++11)
Операторы отношения (устарело в C++20)
Целочисленные функции сравнения
(C++20)(C++20)(C++20)    
(C++20)
Операции обмена и типа
(C++11)
(C++11)
(C++17)
Общие лексические типы
(C++11)
(C++17)
(C++17)
(C++17)
(C++11)
(C++17)
(C++23)
Элементарные преобразования строк
(C++17)
(C++17)
 
Динамическое управление памятью
no section name
Ограниченные алгоритмы неинициализированной памяти
no section name
Поддержка сбора мусора
(C++11)(до C++23)
(C++11)(до C++23)
(C++11)(до C++23)
(C++11)(до C++23)
(C++11)(до C++23)
(C++11)(до C++23)



no section name
 
Определено в заголовочном файле <memory>
Сигнатура вызова
template< итератор-ввода-без-исключения I, ограничитель-без-исключения-для<I> S >

    requires std::destructible<std::iter_value_t<I>>

constexpr I destroy( I first, S last )noexcept;
(1) (начиная с C++20)
template< входной-диапазон-без-исключения R >

    requires std::destructible<ranges::range_value_t<R>>

constexprranges::borrowed_iterator_t<R> destroy( R&& r )noexcept;
(2) (начиная с C++20)
1) Уничтожает объекты в диапазоне [firstlast), как если бы
for(; first != last;++first) std::ranges::destroy_at(std::addressof(*first));return first;
2) То же, что и (1), но использует r в качестве исходного диапазона, как если бы использовались ranges::begin(r) в качестве first и ranges::end(r) в качестве last.

Функционально-подобные объекты, описанные на этой странице, являются ниблоидами, то есть:

На практике они могут быть реализованы как функциональные объекты или со специальными расширениями компилятора.

Содержание

[править]Параметры

first, last пара итератор-ограничитель, обозначающая диапазон элементов для уничтожения
r диапазон для уничтожения

[править]Возвращаемое значение

Итератор при сравнении равный last.

[править]Сложность

Линейная по расстоянию между first и last.

[править]Возможная реализация

struct destroy_fn {template<итератор-ввода-без-исключения I, ограничитель-без-исключения-для<I> S> requires std::destructible<std::iter_value_t<I>>constexpr I operator()(I first, S last)constnoexcept{for(; first != last;++first) std::ranges::destroy_at(std::addressof(*first));return first;}   template<входной-диапазон-без-исключения R> requires std::destructible<std::ranges::range_value_t<R>>constexpr std::ranges::borrowed_iterator_t<R> operator()(R&& r)constnoexcept{return operator()(std::ranges::begin(r), std::ranges::end(r));}};   inlineconstexpr destroy_fn destroy{};

[править]Пример

В следующем примере показано, как использовать ranges::destroy для уничтожения непрерывной последовательности элементов.

#include <iostream>#include <memory>#include <new>   struct Tracer {int value; ~Tracer(){std::cout<< value <<" уничтожен\n";}};   int main(){ alignas(Tracer)unsignedchar 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(ptr, ptr +8);}

Вывод:

0 уничтожен 1 уничтожен 2 уничтожен 3 уничтожен 4 уничтожен 5 уничтожен 6 уничтожен 7 уничтожен

[править]Смотрите также

уничтожает несколько объектов в диапазоне
(ниблоид)[править]
уничтожает объект по заданному адресу
(ниблоид)[править]
(C++17)
уничтожает диапазон объектов
(шаблон функции)[править]
close