make_unique
指定した引数を使用して構築された指定した型のオブジェクトへの unique_ptr を作成して返します。
// make_unique<T>
template<class T,
class... Types>
unique_ptr<T> make_unique(Types&&... Args)
{
return (unique_ptr<T>(new T(forward<Types>(Args)...)));
}
// make_unique<T[]>
template<class T>
make_unique(size_t Size)
{
return (unique_ptr<T>(new Elem[Size]()));
}
// make_unique<T[N]> disallowed
template<class T,
class... Types>
typename enable_if<extent<T>::value != 0,
void>::type make_unique(Types&&...) = delete;
パラメーター
T
unique_ptr が指すオブジェクトの型。Types
Args によって指定されたコンストラクター引数の型。Args
T 型のオブジェクトのコンストラクターに渡す引数。Elem
T 型の要素の配列。Size
新しい配列に領域を割り当てる要素の数。
戻り値
指定した T 型のオブジェクトへの unique_ptr。
解説
最初のオーバーロードは、単一オブジェクトに対して使用されます。2 番目のオーバーロードは、配列に対して呼び出されます。3 番目のオーバーロードは、ユーザーが型引数 (make_unique<T[N]>) で配列のサイズを指定することを防ぎます。この構造は、現在の標準ではサポートされていません。 make_unique を使用して、配列への unique_ptr を作成する場合、配列要素を個別に初期化する必要があります。 このオーバーロードを検討している場合、std::vector の使用が適切である可能性があります。
make_unique は、例外セーフを目的として慎重に実装されるため、unique_ptr コンストラクターを直接呼び出す代わりに、make_unique を使用することをお勧めします。
使用例
次の例は、make_unique を使用する方法を示しています。 その他の例については、「方法: unique_ptr インスタンスを作成して使用する」を参照してください。
class Animal
{
private:
std::wstring genus;
std::wstring species;
int age;
double weight;
public:
Animal(const wstring&, const wstring&, int, double){/*...*/ }
Animal(){}
};
void MakeAnimals()
{
// Use the Animal default constructor.
unique_ptr<Animal> p1 = make_unique<Animal>();
// Use the constructor that matches these arguments
auto p2 = make_unique<Animal>(L"Felis", L"Catus", 12, 16.5);
// Create a unique_ptr to an array of 5 Animals
unique_ptr<Animal[]> p3 = make_unique<Animal[]>(5);
// Initialize the elements
p3[0] = Animal(L"Rattus", L"norvegicus", 3, 2.1);
p3[1] = Animal(L"Corynorhinus", L"townsendii", 4, 1.08);
// auto p4 = p2; //C2280
vector<unique_ptr<Animal>> vec;
// vec.push_back(p2); //C2280
// vector<unique_ptr<Animal>> vec2 = vec; // C2280
// OK. p2 no longer points to anything
vec.push_back(std::move(p2));
// unique_ptr overloads operator bool
wcout << boolalpha << (p2 == false) << endl; // Prints "true"
// OK but now you have two pointers to the same memory location
Animal* pAnimal = p2.get();
// OK. p2 no longer points to anything
Animal* p5 = p2.release();
}
unique_ptr に関連してエラー C2280 が発生した場合、削除された関数であるコピー コンストラクターを呼び出そうとしたことが原因となっている可能性が高いです。
必要条件
<memory>