最終更新日時:
が更新

履歴 編集

class template
<memory>

std::raw_storage_iterator(C++17で非推奨)

namespace std {
  template <class OutputIterator, class T>
  class raw_storage_iterator
    : public iterator<output_iterator_tag, void, void, void, void>;
}

この機能は、C++17から非推奨となった。未初期化メモリをイテレートしながら構築する場合は、アロケータと適切に連携するプログラムを組むこと。

概要

raw_storage_iteratorは、未初期化領域のイテレータをラップし、構築しながら値を出力していく出力イテレータクラスである。

未初期化領域に特化したアルゴリズム以外の、std::copy()std::transform()のような出力イテレータをともなうアルゴリズムに、未初期化領域を出力として使用するためにある。

テンプレートパラメータは、以下を意味する:

  • OutputIterator : 元となる未初期化領域の出力イテレータ型
  • T : このイテレータが出力する型

メンバ関数

名前 説明
(constructor) コンストラクタ
~raw_storage_iterator() = default; デストラクタ
operator= 代入演算子
operator* 間接参照演算子
operator++ イテレータをインクリメントする

メンバ型

名前 説明
difference_type イテレータの差を表す型。 void
pointer ポインタ型。 void
value_type 値の型。 void
iterator_category イテレータ種別。 output_iterator_tag
reference 参照型。 void

非推奨の詳細

未初期化メモリからオブジェクトを構築していくのであれば、アロケータとの連携ができることが重要となるが、このクラスはその用途に適さなかったため、非推奨となった。

#include <iostream>
#include <memory>

#include <vector>
#include <algorithm>

int main()
{
  const std::vector<int> v = {1, 2, 3};

  std::allocator<int> alloc;

  // メモリ確保。
  // この段階では、[p, p + size)の領域は未初期化
  const std::size_t size = 3;
  int* p = alloc.allocate(size);

  // 未初期化領域pを初期化しつつ範囲vから要素をコピー
  // uninitialized_copy()と同じ効果
  std::copy(v.begin(), v.end(),
    std::raw_storage_iterator<int*, int>(p));

  // pの領域が初期化され、かつvからpに要素がコピーされているか確認
  std::for_each(p, p + size, [](int x) {
    std::cout << x << std::endl;
  });

  // 要素を破棄
  for (std::size_t i = 0; i < size; ++i) {
    alloc.destroy(p + i);
  }

  // メモリ解放
  alloc.deallocate(p, size);
}

出力

1
2
3

参照