# make_unique

Introduction
Synopsis
Common Requirements
Free Functions
History

## Introduction

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

## Synopsis

    namespace boost {
        template<class U> // U is not array
        unique_ptr<U> make_unique();

    #if !defined(BOOST_NO_CXX11_VARIADIC_TEMPLATES)
        template<class U, class... Args> // U is not array
        unique_ptr<U> make_unique(Args&&... args);
    #endif

        template<class U> // U is not array
        unique_ptr<U> make_unique(U&& value);

        template<class U> // U is T[]
        unique_ptr<U> make_unique(size_t size);

        template<class U> // U is not array
        unique_ptr<U> make_unique_noinit();

        template<class U> // U is T[]
        unique_ptr<U> make_unique_noinit(size_t size);
    }

## Common Requirements

    template<class U>
        unique_ptr<U> make_unique(args);
    template<class U>
        unique_ptr<U> make_unique_noinit(args);

> Effects: Allocates memory for an object of type `U` (or `T[size]` when `U` is `T[]`, where `size` is determined from `args` as specified by the concrete overload). The object is initialized from `args` as specified by the concrete overload. If an exception is thrown, the functions have no effect.

> Returns: A `unique_ptr` instance that stores and owns the address of the newly constructed object.

> Postconditions: `r.get() != 0`, where `r` is the return value.

> Throws: `bad_alloc`, or an exception thrown from the initialization of the object.

> Remarks:

> > When an object of a non-array type `T` is specified to be initialized to a value `value`, or to `T(list...)`, where `list...` is a list of constructor arguments, `make_unique` shall perform this initialization via the expression `new T(value)` or `new T(list...)` 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 U, class... Args>
    unique_ptr<U> make_unique(Args&&... args);

> Returns: A unique_ptr to an object of type `U`, initialized to `U(forward<Args>(args)...)`.

> Remarks: This overload shall only participate in overload resolution when `U` is not an array type.

> Examples:

> >     unique_ptr<float> p1 = boost::make_unique<float>();
> >     unique_ptr<point> p2 = boost::make_unique<point>(x, y);

    template<class U>
    unique_ptr<U> make_unique(U&& value);

> Returns: A unique_ptr to an object of type `U`, initialized to `move(value)`.

> Remarks: This overload shall only participate in overload resolution when `U` is not an array type.

> Examples:

> >     unique_ptr<string> p1 = boost::make_unique<string>({'a', 'b'});
> >     unique_ptr<point> p2 = boost::make_unique<point>({-10, 25});

    template<class U>
    unique_ptr<U> make_unique(size_t size);

> Returns: A unique_ptr to a value-initialized object of type `T[size]`.

> Remarks: This overload shall only participate in overload resolution when `U` is of the form `T[]`.

> Examples:

> >     unique_ptr<double[]> p1 = boost::make_unique<double[]>(4);
> >     unique_ptr<int[][2]> p2 = boost::make_unique<int[][2]>(2);

    template<class U>
    unique_ptr<U> make_unique_noinit();

> Returns: A unique_ptr to a default-initialized object of type `U`.

> Remarks: This overload shall only participate in overload resolution when `U` is not an array type.

> Examples:

> >     unique_ptr<float> p1 = boost::make_unique_noinit<float>();
> >     unique_ptr<point> p2 = boost::make_unique_noinit<point>();

    template<class U>
    unique_ptr<U> make_unique_noinit(size_t size);

> Returns: A unique_ptr to a default-initialized object of type `T[size]`.

> Remarks: This overload shall only participate in overload resolution when `U` is of the form `T[]`.

> Examples:

> >     unique_ptr<double[]> p1 = boost::make_unique_noinit<double[]>(4);
> >     unique_ptr<int[][2]> p2 = boost::make_unique_noinit<int[][2]>(2);

## History

January 2014. Glen Fernandes contributed implementations of make_unique for objects and arrays.

$Date$

Copyright 2012-2014 Glen Fernandes. Distributed under the Boost Software License, Version 1.0. See accompanying file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt.