- [meta exposition-only]
- ranges[meta header]
- class template[meta id-type]
- cpp20[meta cpp]
- cpp23removed[meta cpp]
copyable-box は、規格の文中に現れる説明専用のクラスである。
copyable-box<T> は、std::optional<T>とほとんど同じであるものの、以下の差分がある。
テンプレートパラメーター制約 copy_constructible<T> && is_object_v<T> をもつ。
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;
}- copyable-box[italic]
- is_nothrow_copy_constructible_v[link /reference/type_traits/is_nothrow_copy_constructible.md]
- emplace[link /reference/optional/optional/emplace.md]
- reset[link /reference/optional/optional/reset.md]
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;
}- copyable-box[italic]
- is_nothrow_move_constructible_v[link /reference/type_traits/is_nothrow_move_constructible.md]
- emplace[link /reference/optional/optional/emplace.md]
- reset[link /reference/optional/optional/reset.md]
以下のことが推奨される。
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