# make_unique

## Introduction

The header file <boost/make_unique.hpp> provides overloads of function template `make_unique` for convenient creation of `std::unique_ptr` objects.

## Synopsis

### Header <boost/smart_ptr/make_unique.hpp>

`namespace boost {`

> `template<class T>
> std::unique_ptr<T> make_unique();`

> `template<class T, class... Args>
> std::unique_ptr<T> make_unique(Args&&... args);`

> `template<class T>
> std::unique_ptr<T> make_unique(T&& value);`

> `template<class T>
> std::unique_ptr<T> make_unique(std::size_t size);`

> `template<class T>
> std::unique_ptr<T> make_unique_noinit();`

> `template<class T>
> std::unique_ptr<T> make_unique_noinit(std::size_t size);`

`}`

## Common Requirements

### `template<class T, Args>
std::unique_ptr<T> make_unique(args);`

Effects:
  Allocates storage for an object of type `T` (or `E[size]` when `T` is `E[]`, where `size` is determined from `args` as specified by the concrete overload). The storage is initialized from `args` as specified by the concrete overload. If an exception is thrown, the functions have no effect.
Returns:
  A `std::unique_ptr` instance that stores and owns the address of the newly allocated and constructed object.
Postconditions:
  `r.get() != 0`, where `r` is the return value.
Throws:
  `std::bad_alloc`, or an exception thrown from the initialization of the object.
Remarks:
  - When an object of a scalar type T is specified to be initialized to a value `value`, or to `T(args...)`, where `args...` is a list of constructor arguments, `make_unique` shall perform this initialization via the expression `new T(value)` or `new T(args...)` respectively.
  - When an object of type `T` is specified to be value-initialized, `make_unique` shall perform this initialization via the expression `new T()`.
  - When an object of type `T` is specified to be default-initialized, `make_unique_noinit` shall perform this initialization via the expression `new T`.

## Free functions

### `template<class T, class... Args>
std::unique_ptr<T> make_unique(Args&&... args);`

Returns:
  A `std::unique_ptr` to an object of type `T`, initialized to `std::forward<Args>(args)...`.
Remarks:
  This overload shall only participate in overload resolution when `T` is not an array type.
Example:
  `boost::make_unique<double>(1.0);`

### `template<class T>
std::unique_ptr<T> make_unique(T&& value);`

Returns:
  A `std::unique_ptr` to an object of type `T`, initialized to `std::move(value)`.
Remarks:
  This overload shall only participate in overload resolution when `T` is not an array type.
Example:
  `boost::make_unique<point>({1.0, -1.0});`

### `template<class T>
std::unique_ptr<T> make_unique(std::size_t size);`

Returns:
  A `std::unique_ptr` to a value-initialized object of type `E[size]`.
Remarks:
  This overload shall only participate in overload resolution when `T` is of the form `E[]`.
Example:
  `boost::make_unique<int[]>(8);`

### `template<class T>
std::unique_ptr<T> make_unique_noinit();`

Returns:
  A `std::unique_ptr` to a default-initialized object of type `T`.
Remarks:
  This overload shall only participate in overload resolution when `T` is not an array type.
Example:
  `boost::make_unique_noinit<std::tm>();`

### `template<class T>
std::unique_ptr<T> make_unique_noinit(std::size_t size);`

Returns:
  A `std::unique_ptr` to a default-initialized object of type `E[size]`.
Remarks:
  This overload shall only participate in overload resolution when `T` is of the form `E[]`.
Example:
  `boost::make_unique_noinit<char[]>(64);`

## History

Boost 1.56
  Glen Fernandes contributed implementations of make_unique for scalars and arrays

Copyright 2012-2014 Glen Fernandes. Distributed under the Boost Software License, Version 1.0.