最終更新日時(UTC): 2024年06月11日 13時45分38秒
Akira Takahashi が更新

履歴 編集

function
<any>

# std::any::コンストラクタ(C++17)

    constexpr any() noexcept;                  // (1)
    any(const any& other);                     // (2)
    any(any&& other) noexcept;                 // (3)

    template <class T>
    any(T&& value);                            // (4)

    template <class T, class... Args>
    explicit any(in_place_type_t<T>,
                 Args&&... args);              // (5)

    template <class T, class U, class... Args>
    explicit any(in_place_type_t<T>,
                 initializer_list<U> il,
                 Args&&... args);              // (6)

## 概要

- (1) : 値を保持していない状態にする
- (2) : コピーコンストラクタ
- (3) : ムーブコンストラクタ
- (4) : 任意の型`T`の値`value`を`*this`にムーブして保持する
- (5) : 任意の型`T`のコンストラクタ引数`args...`をとり、コンストラクタ内部で`T`型オブジェクトを構築して保持する
- (6) : 任意の型`T`のコンストラクタ引数`il`と`args...`をとり、コンストラクタ内部で`T`型オブジェクトを構築して保持する

## テンプレートパラメータ制約

- (4) : `is_copy_constructible_v<std::decay_t<T>> == true`であること
- (5) : `using VT = std::decay_t<T>`であるとして、`is_copy_constructible_v<VT> == true`かつ`is_constructible_v<VT, Args...> == true`であること
- (6) : `using VT = std::decay_t<T>`であるとして、`is_copy_constructible_v<VT> == true`かつ`is_constructible_v<VT, std::initializer_list<U>&, Args...> == true`であること

## 効果

- (2) : `other.has_value() == false`である場合、値を保持しない`any`オブジェクトを構築する。そうでなければ、`any(in_place<T>, any_cast<const T&>(other))`と等価の効果をもつ
- (3) : `other.has_value() == false`である場合、値を保持しない`any`オブジェクトを構築する。そうでなければ、`other`が保持する値を`this`にムーブする
- (4) : `std::forward<T>(value)`をコンストラクタ引数として、型`std::decay_t<T>`のオブジェクトを直接構築して保持する
- (5) : `std::forward<Args>(value)...`をコンストラクタ引数として、型`std::decay_t<T>`のオブジェクトを直接構築して保持する
- (6) : `il`と`std::forward<Args>(value)...`をコンストラクタ引数として、型`std::decay_t<T>`のオブジェクトを直接構築して保持する

## 事後条件

- (1) : `has_value() == false`となる
- (3) : `other`は有効だが未規定の状態となる

## 例外

- (2) : `other`が保持する型`T`のオブジェクトの選択されたコンストラクタが、任意の例外を送出する可能性がある
- (4), (5), (6) : 型`std::decay_t<T>`の選択されたコンストラクタが、任意の例外を送出する可能性がある

## 例

    #include <any>
    #include <string>
    #include <vector>
    #include <cassert>

    int main()
    {
      // (1)
      {
        std::any x;
        assert(!x.has_value());
      }

      // (2)
      {
        std::any a = 3;
        std::any b = a;

        assert(std::any_cast<int>(a) == 3);
        assert(std::any_cast<int>(b) == 3);
      }

      // (3)
      {
        std::any a = std::string("Hello");
        std::any b = std::move(a);

        assert(std::any_cast<std::string>(b) == "Hello");
      }

      // (4)
      {
        std::any a = 3;
        std::any b = std::string("Hello");

        assert(std::any_cast<int>(a) == 3);
        assert(std::any_cast<std::string>(b) == "Hello");
      }

      // (5)
      {
        std::any x {
          std::in_place_type<std::string>,
          3,
          'z'
        };

        assert(std::any_cast<std::string>(x) == "zzz");
      }

      // (6)
      {
        std::allocator<int> alloc;
        std::any x {
          std::in_place_type<std::vector<int>>,
          {3, 1, 4},
          alloc
        };

        const auto& vec = std::any_cast<const std::vector<int>&>(x);
        assert(vec[0] == 3);
        assert(vec[1] == 1);
        assert(vec[2] == 4);
      }
    }

### 出力

## バージョン

### 言語

- C++17

### 処理系

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