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]
)
戻り値
- (1) :
unique_ptr<T>(new T(std::forward<Args>(args)...))
- (2) :
unique_ptr<T>(new remove_extent_t<T>[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;
}
xxxxxxxxxx
#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
処理系
- Clang: 3.4 ✅
- GCC: 4.9 ✅
- ICC: ??
- Visual C++: 2013 ✅, 2015 ✅
参照
- N3588 make_unique
- N3656 make_unique (Revision 1)
- Why is
make_unique<T[N]>
disallowed? - stackoverflow- (3)のオーバーロードの意味について
- P2273R3 Making
std::unique_ptr
constexpr