◐ Shell
clean mode source ↗

std::raw_storage_iterator — cppreference.com

Материал из cppreference.com

<tbody> </tbody> <tbody class="t-dcl-rev "> </tbody><tbody> </tbody>

Определено в заголовочном файле <memory>

template< class OutputIt, class T > class raw_storage_iterator : public std::iterator<std::output_iterator_tag, void, void, void, void>;

(до C++17)

template< class OutputIt, class T > class raw_storage_iterator;

(начиная с C++17)
(устарело в C++17)
(удалено в C++20)

Оператор вывода std::raw_storage_iterator позволяет стандартным алгоритмам сохранять результаты в неинициализированной памяти. Всякий раз, когда алгоритм записывает объект типа T в разыменованный итератор, объект создаётся копированием в месте в неинициализированной памяти, на которое указывает итератор. Параметр шаблона OutputIt это любой тип, который соответствует требованиям LegacyOutputIterator и имеет operator*, определённый для возврата объекта, для которого operator& возвращает объект типа T*. Обычно тип T* используется как OutputIt.

Требования к типу

Функции-элементы

Типы элементы

Тип элемент Определение
iterator_category std::output_iterator_tag
value_type void
difference_type

void

(до C++20)

std::ptrdiff_t

(начиная с C++20)
pointer void
reference void

Типы элемены iterator_category, value_type, difference_type, pointer и reference должны быть получены путём наследования от std::iterator<std::output_iterator_tag, void, void, void, void>.

(до C++17)

Примечание

std::raw_storage_iterator устарел в первую очередь из-за его небезопасного поведения в отношении исключений. В отличие от std::uninitialized_copy, он не обрабатывает исключения во время таких операций, как std::copy, что потенциально может привести к утечкам ресурсов из-за отсутствия отслеживания количества успешно созданных объектов, и отсутствию их надлежащего уничтожения при наличии исключений.

Пример

#include <iostream>
#include <string>
#include <memory>
#include <algorithm>

int main()
{
    const std::string s[] = {"Это", "тест", "."};
    std::string* p = std::allocator<std::string>().allocate(3);
 
    std::copy(std::begin(s), std::end(s),
              std::raw_storage_iterator<std::string*, std::string>(p));
 
    for(std::string* i = p; i!=p+3; ++i) {
        std::cout << *i << '\n';
        i->~basic_string<char>();
    }
    std::allocator<std::string>().deallocate(p, 3);
}

Вывод:

Смотрите также