std::ranges::destroy
Материал из cppreference.com
Определено в заголовочном файле <memory> | ||
Сигнатура вызова | ||
template< итератор-ввода-без-исключения I, ограничитель-без-исключения-для<I> S > requires std::destructible<std::iter_value_t<I>> | (1) | (начиная с C++20) |
template< входной-диапазон-без-исключения R > requires std::destructible<ranges::range_value_t<R>> | (2) | (начиная с C++20) |
1) Уничтожает объекты в диапазоне
[
first,
last)
, как если бы 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++20) | уничтожает несколько объектов в диапазоне (ниблоид) |
(C++20) | уничтожает объект по заданному адресу (ниблоид) |
(C++17) | уничтожает диапазон объектов (шаблон функции) |