# std::make_optional

From cppreference.com
< cpp‎ | utility‎ | optional

Defined in header `<optional>` |  |
template< class T > constexpr std::optional < std::decay_t <T>> make_optional( T&& value ); | (1) | (since C++17)
template< class T, class... Args > constexpr std::optional <T> make_optional( Args&&... args ); | (2) | (since C++17)
template< class T, class U, class... Args > constexpr std::optional <T> make_optional( std::initializer_list <U> il, Args&&... args ); | (3) | (since C++17)

1) Creates an optional object from value. Effectively calls std::optional < std::decay_t <T>>( std::forward <T>(value)).
2) Creates an optional object constructed in-place from args.... Equivalent to return std::optional <T>( std::in_place, std::forward <Args>(args)...);.
This overload participates in overload resolution only if std::is_constructible_v <T, Args...> is true.
3) Creates an optional object constructed in-place from il and args.... Equivalent to return std::optional <T>( std::in_place, il, std::forward <Args>(args)...);.
This overload participates in overload resolution only if std::is_constructible_v <T, std::initializer_list <U>&, Args...> is true.

### Parameters

value | - | the value to construct optional object with
il, args | - | arguments to be passed to the constructor of `T`

### Return value

The constructed optional object.

### Exceptions

Throws any exception thrown by the constructor of `T`.

### Notes

`T` need not be movable for overloads (2,3) due to guaranteed copy elision.

### Example

Run this code

    #include <iomanip>
    #include <iostream>
    #include <optional>
    #include <string>
    #include <vector>

    int main()
    {
        auto op1 = std::make_optional<std::vector<char>>({'a','b','c'});
        std::cout << "op1: ";
        for (char c : op1.value())
            std::cout << c << ',';
        auto op2 = std::make_optional<std::vector<int>>(5, 2);
        std::cout << "\nop2: ";
        for (int i : *op2)
            std::cout << i << ',';
        std::string str{"hello world"};
        auto op3 = std::make_optional<std::string>(std::move(str));
        std::cout << "\nop3: " << std::quoted(op3.value_or("empty value")) << '\n';
        std::cout << "str: " << std::quoted(str) << '\n';
    }

Possible output:

    op1: a,b,c,
    op2: 2,2,2,2,2,
    op3: "hello world"
    str: ""

### See also

(constructor) | constructs the `optional` object (public member function)

Retrieved from "https://en.cppreference.com/mwiki/index.php?title=cpp/utility/optional/make_optional&oldid=176015"