yohhoyの日記

技術的メモをしていきたい日記

std::unique_ptrと添字アクセス

C++11標準ライブラリ提供のstd::unique_ptrクラステンプレートでは、第1テンプレート引数に配列型T[]を指定したときのみ添字アクセス([]演算子)を利用可能となる。ただし、この部分特殊化では*演算子->演算子は提供されない。

#include <memory>

{
  std::unique_ptr<int> p1( new int(100) );
  *p1 = 42;    // OK
  p1[0] = 21;  // NG: ill-formed
} // "delete p1.get()"が呼び出される

{
  std::unique_ptr<int[]> p2( new int[10] );
  *p2 = 42;    // NG: ill-formed 
  p2[0] = 21;  // OK
} // "delete[] p2.get()"が呼び出される

N3337 20.7.1.3/p1より引用。

A specialization for array types is provided with a slightly altered interface.

  • Conversions between different types of unique_ptr<T[], D> or to or from the non-array forms of unique_ptr produce an ill-formed program.
  • Pointers to types derived from T are rejected by the constructors, and by reset.
  • The observers operator* and operator-> are not provided.
  • The indexing observer operator[] is provided.
  • The default deleter will call delete[]