最終更新日時: 2025年07月14日 23時04分00秒 (JST)
Koichi Murase が更新

履歴 編集

function template
<optional>

# std::make_optional(C++17)

    namespace std {
      template <class T>
      constexpr optional<see below> make_optional(T&& v);    // (1)

      template <class T, class... Args>
      constexpr optional<T> make_optional(Args&&... args);   // (2)

      template <class T, class U, class... Args>
      constexpr optional<T> make_optional(
                                std::initializer_list<U> il,
                                Args&&... args);             // (3)
    }

## 概要

有効な値を保持する`optional`オブジェクトを構築する。

- (1) : 型`T`の値を受け取り、それを有効値として保持する`optional`オブジェクトを構築する
- (2) : 型`T`のコンストラクタ引数を受け取り、関数内で`T`オブジェクトを構築し、それを有効値として保持する`optional`オブジェクトを構築する
- (3) : 型`T`のコンストラクタ引数として初期化子リストと任意個の引数を受け取り、関数内で`T`オブジェクトを構築し、それを有効値として保持する`optional`オブジェクトを構築する

## 効果

- (1) : `return optional<decay_t<T>>(std::forward<T>(v))`
- (2) : `return optional<T>(in_place, std::forward<Args>(args)...);` と等価の処理を行う
- (3) `return optional<T>(in_place, il, std::forward<Args>(args)...);` と等価の処理を行う

## 例

    #include <cassert>
    #include <optional>
    #include <type_traits>
    #include <string>
    #include <vector>

    int main()
    {
      // (1)
      {
        auto p = std::make_optional("Hello");
        static_assert(std::is_same_v<decltype(p), std::optional<const char*>>);
      }

      // (2)
      {
        auto p = std::make_optional<std::string>(3, 'A');

        assert(p.value() == "AAA");
        static_assert(std::is_same_v<decltype(p), std::optional<std::string>>);
      }

      // (3)
      {
        std::allocator<int> alloc;
        auto p = std::make_optional<std::vector<int>>({3, 1, 4}, alloc);

        assert(p.value()[0] == 3);
        assert(p.value()[1] == 1);
        assert(p.value()[2] == 4);
        static_assert(std::is_same_v<decltype(p), std::optional<std::vector<int>>>);
      }
    }

### 出力

## バージョン

### 言語

- C++17

### 処理系

- Clang: 4.0.1 ✅
- GCC: 7.2 ✅
- ICC: ??
- Visual C++: ??