std::raw_storage_iterator — cppreference.com
Материал из cppreference.com
<tbody> </tbody> <tbody class="t-dcl-rev "> </tbody><tbody> </tbody>
| Определено в заголовочном файле |
||
|
|
(до C++17) | |
|
|
(начиная с 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
|
| ||||
pointer
|
void
| ||||
reference
|
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); }
Вывод: