make_unique
Crea e restituisce unique_ptr a un oggetto del tipo specificato strutturato utilizzando gli argomenti specificati.
// 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;
Parametri
T
Tipo dell'oggetto a cui punta unique_ptr.Types
Tipi degli argomenti del costruttore specificati da Args.Args
Gli argomenti da passare al costruttore del tipo di oggetto T.Elem
Una matrice di elementi di tipo T.Size
Il numero di elementi per allocare spazio per la nuova matrice.
Valore restituito
Un unique_ptr per un oggetto del tipo specificato T.
Note
Il primo overload viene utilizzato per i singoli oggetti, il secondo overload viene invocato per gli array, e il terzo overload impedisce di specificare la dimensione di un array nell'argomento di tipo (make_unique<T[N]>); questa costruzione non è supportata dallo standard corrente. Quando si utilizza make_unique per creare unique_ptr in una matrice, è necessario inizializzare separatamente gli elementi della matrice. Se si sta considerando questo overload, una scelta migliore consiste probabilmente nell'utilizzare un std::vector.
Poiché make_unique viene implementato con cautela per la sicurezza dell'eccezione, si consiglia di utilizzare make_unique anziché chiamare direttamente i costruttori unique_ptr.
Esempio
Nell'esempio riportato di seguito viene illustrato l'utilizzo di make_unique. Per ulteriori esempi, vedere Procedura: creare e utilizzare istanze 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();
}
Quando viene visualizzato l'errore C2280 in relazione a unique_ptr, è quasi certo che sia perché si tenta di invocare il costruttore di copia, che è una funzione eliminata.
Requisiti
<memoria>