代入可能ラッパー (C++20)
template< class T > requires std::copy_constructible<T> && std::is_object_v<T> |
(C++20以降) (C++23まで) (説明用*) |
|
| template< class T > requires std::move_constructible<T> && std::is_object_v<T> |
(C++23から) (説明用*) |
|
ranges::single_view, ranges::repeat_view,(since C++23) および invocableオブジェクトを格納するレンジアダプタは、概念的なクラステンプレート copyable-box(until C++23)movable-box(since C++23) に基づいて指定されます。ここで示される名前は、概念的な目的のためだけのものであり、実装に固有のものではありません。
このラッパーは std::optional<T> と全く同様に動作しますが、デフォルトコンストラクタ、コピー代入演算子、およびムーブ代入演算子が std::optional のものとは(条件付きで)異なり、必要に応じて `T` に代入可能性を追加し、常に copyableまたは movable(since C++23) を満たすようにします。
|
もし `T` が既に |
(C++23まで) |
|
もし `T` が
/*movable-box*/<T> は常に値を持つため、`T` オブジェクトのみを格納することができます。 |
(C++23から) |
目次 |
[編集] テンプレートパラメータ
| T | - | 格納される値の型。オブジェクト型で、copy_constructible(until C++23)move_constructible(since C++23) をモデルとする必要があります。 |
[編集] メンバ関数
デフォルトコンストラクタ
constexpr /*copyable-box*/() noexcept(std::is_nothrow_default_constructible_v<T>) requires std::default_initializable<T> |
(C++20以降) (C++23まで) |
|
| constexpr /*movable-box*/() noexcept(std::is_nothrow_default_constructible_v<T>) requires std::default_initializable<T> |
(C++23から) | |
デフォルトコンストラクタは、`T` が default_initializable をモデルとする場合にのみ提供されます。
デフォルト構築されたラッパーは、値初期化された `T` オブジェクトを含みます。
代入演算子
| (1) | ||
constexpr /*copyable-box*/& operator=(const /*copyable-box*/& other); noexcept(/* see below */); |
(C++20以降) (C++23まで) |
|
| constexpr /*movable-box*/& operator=(const /*movable-box*/& other) noexcept(/* see below */) requires std::copy_constructible<T>; |
(C++23から) | |
| (2) | ||
constexpr /*copyable-box*/& operator=(/*copyable-box*/&& other) noexcept(std::is_nothrow_move_constructible_v<T>); |
(C++20以降) (C++23まで) |
|
| constexpr /*movable-box*/& operator=(/*movable-box*/&& other) noexcept(std::is_nothrow_move_constructible_v<T>); |
(C++23から) | |
|
constexpr /*copyable-box*/& operator=(const /*copyable-box*/& other) |
(C++23まで) |
|
constexpr /*movable-box*/& operator=(const /*movable-box*/& other) |
(C++23から) |
std::optional のコピー代入演算子 と等価です。|
constexpr /*copyable-box*/& operator=(/*copyable-box*/&& other) |
(C++23まで) |
|
constexpr /*movable-box*/& operator=(/*movable-box*/&& other) |
(C++23から) |
std::optional のムーブ代入演算子 と等価です。[編集] 注記
a copyable-box(until C++23)movable-box(since C++23) は、値を持たないのは以下の場合です。
P2325R3 より前は、このラッパーは標準では semiregular-box と呼ばれ、デフォルトコンストラクタが常に提供されていたため(これは値を持たないラッパーを構築する可能性があります)、常に semiregular を満たしていました。
| 機能テストマクロ | 値 | 規格 | 機能 |
|---|---|---|---|
__cpp_lib_ranges |
201911L |
(C++20) | レンジライブラリと制約付きアルゴリズム |
202106L |
(C++20) (DR) |
非デフォルト初期化可能なview | |
202207L |
(C++23) | ムーブ専用型を許可するためのレンジアダプタの緩和 |
[編集] 不具合報告
以下の動作変更を伴う欠陥報告が、以前に公開されたC++標準に遡って適用されました。
| DR | 適用対象 | 公開された動作 | 正しい動作 |
|---|---|---|---|
| P2325R3 | C++20 | もし `T` が default_initializable でない場合、デフォルトコンストラクタは値を持たないラッパーを構築します。 |
ラッパーはまたdefault_initializableではありません。 |
| LWG 3572 | C++20 | 条件付きで異なる代入演算子は constexpr ではありませんでした。 | constexpr になりました。 |
[編集] 関連項目
指定された値の単一要素を含む view(クラステンプレート) (カスタマイゼーションポイントオブジェクト) | |
同じ値を繰り返し生成することで得られるシーケンスからなる view(クラステンプレート) (カスタマイゼーションポイントオブジェクト) | |
述語を満たすrangeの要素からなる view(クラステンプレート) (rangeアダプタオブジェクト) | |
各要素に変換関数を適用するシーケンスの view(クラステンプレート) (rangeアダプタオブジェクト) | |
別のviewの先頭から、述語がfalseを返す最初の要素までの要素からなる view(クラステンプレート) (rangeアダプタオブジェクト) | |
別のviewの要素から、述語がfalseを返す最初の要素までの先頭部分シーケンスをスキップして構成される view(クラステンプレート) (rangeアダプタオブジェクト) | |
適合するviewの対応する要素に変換関数を適用した結果からなる view(クラステンプレート) (カスタマイゼーションポイントオブジェクト) | |
適合するviewの隣接する要素に変換関数を適用した結果からなる view(クラステンプレート) (rangeアダプタオブジェクト) |