最終更新日時(UTC):
が更新

履歴 編集

function template
<memory>

std::make_unique

namespace std {
  template <class T, class... Args>
  unique_ptr<T> make_unique(Args&&... args);           // (1) C++14
  template <class T, class... Args>
  constexpr unique_ptr<T> make_unique(Args&&... args); // (1) C++23

  template <class T>
  unique_ptr<T> make_unique(size_t n);           // (2) C++14
  template <class T>
  constexpr unique_ptr<T> make_unique(size_t n); // (2) C++23

  template <class T, class... Args>
  unspecified make_unique(Args&&...) = delete; // (3)
}

概要

unique_ptrオブジェクトを構築する。

  • (1) : 非配列型Tのコンストラクタ引数を受け取り、unique_ptr<T>オブジェクトを構築する。
  • (2) : 配列型Tの要素数を受け取り、unique_ptr<T>オブジェクトを構築する。
  • (3) : (1)に配列型が指定された場合に、許可されていないオーバーロードとして宣言される。

テンプレートパラメータ制約

  • (1) : Tは配列型ではない
  • (2) : Tは要素数不明の配列型(U[]
  • (3) : Tは要素数既知の配列型(U[N]

戻り値

備考

この関数では初期値が指定されない場合に確保した領域にオブジェクトが値初期化され構築される。値初期化においては、組み込み型は0相当の値で初期化され、クラス型はデフォルトコンストラクタによって初期化される。この関数でメモリを確保した後ですぐに別の値で上書きしている場合、代わりにmake_unique_for_overwrite()を使用することで初期化のオーバーヘッドを削減できる可能性がある。

#include <iostream>
#include <memory>
#include <utility>

int main()
{
  // (1)
  // 型Tのコンストラクタ引数を受け取ってunique_ptrオブジェクトを構築。
  //
  // ここでは、型std::pair<First, Second>のunique_ptrオブジェクトを構築するために、
  // First型とSecond型の引数を渡している。
  std::unique_ptr<std::pair<int, int>> p1 = std::make_unique<std::pair<int, int>>(3, 1);
  std::cout << p1->first << ':' << p1->second << std::endl;

  // (2)
  // 型T[]の要素数を受け取ってunique_ptr<T[]>オブジェクトを構築。
  //
  // ここでは、要素数3の、int型動的配列を構築している。
  std::unique_ptr<int[]> p2 = std::make_unique<int[]>(3);
  p2[0] = 1;
  p2[1] = 2;
  p2[2] = 3;
}

出力

3:1

バージョン

言語

  • C++14

処理系

参照

関連項目