最終更新日時: 2026年02月08日 18時20分19秒 (JST)
yoh が更新

履歴 編集

class template
<ranges>

# copyable-box(C++20)(C++23で削除)

## 概要

`copyable-box` は、規格の文中に現れる説明専用のクラスである。

`copyable-box<T>` は、`std::optional<T>`とほとんど同じであるものの、以下の差分がある。

### 差分1

テンプレートパラメーター制約 `copy_constructible<T> && is_object_v<T>` をもつ。

### 差分2

`T`が`copyable`のモデルでない場合、コピー代入演算子は以下のように定義される。

    constexpr copyable-box& operator=(const copyable-box& that) noexcept(is_nothrow_copy_constructible_v<T>) {
      if (this != addressof(that)) {
        if (that) emplace(*that);
        else reset();
      }
      return *this;
    }

### 差分3

`T`が`copyable`のモデルでない場合、ムーブ代入演算子は以下のように定義される。

    constexpr copyable-box& operator=(copyable-box&& that) noexcept(is_nothrow_move_constructible_v<T>) {
      if (this != addressof(that)) {
        if (that) emplace(std::move(*that));
        else reset();
      }
      return *this;
    }

### その他

以下のことが推奨される。

- `copy_constructible<T>` なら、`movable-box<T>` は `T` が `copyable`のモデルであるか、`is_nothrow_move_constructible_v<T> && is_nothrow_copy_constructible_v<T>`を満たす場合のみ値を保持する。

## 備考

このクラスはC++23で`movable-box`に置き換えられた。

## バージョン

### 言語

- C++20

## 参照

- N4861 24 Ranges library
- C++20 ranges