make_unique
Cria e retorna um unique_ptr para um objeto do tipo especificado, que é construído usando os argumentos especificados.
// 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;
Parâmetros
T
O tipo de objeto ao qual unique_ptr apontará.Types
Os tipos dos argumentos de construtor especificados por Args.Args
Os argumentos a serem passados ao construtor do objeto do tipo T.Elem
Uma matriz de elementos de tipo T.Size
O número de elementos para alocar espaço para a nova matriz.
Valor de Retorno
Um unique_ptr para um objeto do tipo especificado T.
Comentários
A primeira sobrecarga é usada para um único objeto, a segunda sobrecarga é chamada para matrizes, e a terceira sobrecarga evita impede que você especifique um tamanho da matriz no argumento de tipo (make_uniqueT<[N]>); essa construção não é suportada pelo padrão atual. Quando você usa make_unique para criar um unique_ptr a uma matriz, você precisa inicializar os elementos da matriz separadamente. Se você estiver considerando essa sobrecarga, talvez a melhor opção é usar std::vector.
Como make_unique é implementado com cuidado para a segurança de exceção, recomendamos que você use make_unique em vez de chamar diretamente construtores de unique_ptr .
Exemplo
O exemplo a seguir mostra como usar make_unique. Para obter mais exemplos, consulte Como criar e usar instâncias 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 você visualizar o erro C2280 em relação a unique_ptr, é provavelmente como você está tentando invocar o construtor de cópia, que é uma função excluída.
Requisitos
<memória>