make_unique
Vytvoří a vrátí unique_ptr na objekt zadaného typu, který je vyroben pomocí zadaných argumentů.
// 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;
Parametry
T
Typ objektu, který unique_ptr bude odkazovat.Types
Typy argumentů konstruktoru dané Args.Args
Argumenty, které mají být předány konstruktoru objektu typu T.Elem
Pole elementů typu T.Size
Počet prvků přidělit prostor pro nové pole.
Návratová hodnota
unique_ptr do objektu zadaného typu T.
Poznámky
První přetížení se používá pro jednotlivé objekty, druhý přetížení je vyvolána pro pole a zabraňuje přetížení třetí zabrání určující pro velikost pole v argumentu typ (make_unique<T [N]>); Tato konstrukce není podporována aktuálním standardem.Používáte-li make_unique k vytvoření unique_ptr pro pole, je třeba inicializovat prvky pole zvlášť.Pokud uvažujete o této přetížení, možná vhodnější je použít std::vector.
Vzhledem k tomu, make_unique je pečlivě implementovány pro bezpečnostní výjimky, doporučujeme, použít make_unique namísto přímé volání unique_ptr konstruktory.
Příklad
Následující příklad ukazuje, jak používat funkci make_unique.Další příklady naleznete v tématu Postupy: Vytváření a používání instancí ukazatelů 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();
}
Po zobrazení chyby C2280 v souvislosti s unique_ptr, je téměř jistě vzhledem k tomu, že jste se pokusili vyvolat kopie konstruktoru, což je funkce odstraněny.
Požadavky
<paměť>
Viz také
Úkoly
Postupy: Vytváření a používání instancí ukazatelů unique_ptr