# std::raw_storage_iterator

< cpp‎ | memory

定义于头文件 `<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++20 中移除)

输出迭代器 `std::raw_storage_iterator` 使得标准算法能存储结果于未初始化内存。凡在算法写 `T` 类型对象到解引用后的迭代器时，对象被复制构造到该迭代器所指向的未初始化存储中的位置。模板形参 `OutputIt` 是任何满足老式输出迭代器 (LegacyOutputIterator) 要求的类型，并拥有定义为返回对象的 operator* ， operator& 对该对象返回 `T*` 类型值。通常，以类型 `T*` 为 `OutputIt` 。

### 类型要求

- `OutputIt` 必须满足老式输出迭代器 (LegacyOutputIterator) 的要求。

### 成员函数

(构造函数) | 创建新的 `raw_storage_iterator` (公开成员函数)
operator= | 在缓冲区中的被指向位置构造对象 (公开成员函数)
operator* | 解引用迭代器 (公开成员函数)
operator++operator++(int) | 推进迭代器 (公开成员函数)
base (C++17 起) | 提供到被包装迭代器的访问 (公开成员函数)

### 成员类型

成员类型 | 定义
`iterator_category` | std::output_iterator_tag
`value_type` | void
`difference_type` |
void | (C++20 前)
std::ptrdiff_t | (C++20 起)
`pointer` | void
`reference` | void

要求通过从 std::iterator<std::output_iterator_tag, void, void, void, void> 继承获得成员类型 `iterator_category`、 `value_type`、 `difference_type`、 `pointer` 及 `reference` 。 | (C++17 前)

### 示例

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

    int main()
    {
        const std::string s[] = {"This", "is", "a", "test", "."};
        std::string* p = std::allocator<std::string>().allocate(5);

        std::copy(std::begin(s), std::end(s),
                  std::raw_storage_iterator<std::string*, std::string>(p));

        for(std::string* i = p; i!=p+5; ++i) {
            std::cout << *i << '\n';
            i->~basic_string<char>();
        }
        std::allocator<std::string>().deallocate(p, 5);
    }

输出：

    This
    is
    a
    test
    .

### 参阅

allocator_traits (C++11) | 提供关于分配器类型的信息 (类模板)
scoped_allocator_adaptor (C++11) | 为多级容器实现的多级分配器 (类模板)
uses_allocator (C++11) | 检查指定的类型是否支持使用分配器的构造 (类模板)