Condividi tramite


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>

Vedere anche

Attività

Procedura: creare e utilizzare istanze unique_ptr