名前空間
変種
操作

代入可能ラッパー (C++20)

From cppreference.com
< cpp‎ | ranges
 
 
Rangesライブラリ
Rangeアダプタ
ヘルパーアイテム
copyable-box
movable-box
(C++23まで)  (C++23)


 
template< class T >

    requires std::copy_constructible<T> && std::is_object_v<T>

class /*copyable-box*/;
(C++20以降)
(C++23まで)
(説明用*)
template< class T >

    requires std::move_constructible<T> && std::is_object_v<T>

class /*movable-box*/;
(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` が既に copyable であるか、または std::is_nothrow_move_constructible_v<T>std::is_nothrow_copy_constructible_v<T> の両方が true である場合、/*copyable-box*/<T> は常に値を持つため、`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>

    : /*copyable-box*/(std::in_place) { }
(C++20以降)
(C++23まで)
constexpr /*movable-box*/() noexcept(std::is_nothrow_default_constructible_v<T>)

    requires std::default_initializable<T>

    : /*movable-box*/(std::in_place) { }
(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から)
1) もし std::copyable<T> がモデル化されていない場合、コピー代入演算子は以下のように等価に定義されます。

constexpr /*copyable-box*/& operator=(const /*copyable-box*/& other)
    noexcept(std::is_nothrow_copy_constructible_v<T>)
{
    if (this != std::addressof(other))
        if (other)
            emplace(*other);
        else
            reset();

    return *this;
}

(C++23まで)

constexpr /*movable-box*/& operator=(const /*movable-box*/& other)
    noexcept(std::is_nothrow_copy_constructible_v<T>)
    requires std::copy_constructible<T>
{
    if (this != std::addressof(other))
        if (other)
            emplace(*other);
        else
            reset();

    return *this;
}

(C++23から)
そうでなければ、std::optional のコピー代入演算子 と等価です。
2) もし std::movable<T> がモデル化されていない場合、ムーブ代入演算子は以下のように等価に定義されます。

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

    return *this;
}

(C++23まで)

constexpr /*movable-box*/& operator=(/*movable-box*/&& other)
    noexcept(std::is_nothrow_move_constructible_v<T>)
{
    if (this != std::addressof(other))
        if (other)
            emplace(std::move(*other));
        else
            reset();

    return *this;
}

(C++23から)
そうでなければ、std::optional のムーブ代入演算子 と等価です。

std::optional と同一のメンバ

メンバ関数

optional オブジェクトを構築する
(public member function of std::optional<T>) [編集]
保持されている値があれば、それを破棄する
(public member function of std::optional<T>) [編集]
内容を代入する
(public member function of std::optional<T>) [編集]
監視
保持されている値にアクセスする
(public member function of std::optional<T>) [編集]
オブジェクトが値を保持しているか確認する
(public member function of std::optional<T>) [編集]
変更
保持されている値を破棄する
(public member function of std::optional<T>) [編集]
保持する値を直接構築する
(public member function of std::optional<T>) [編集]

[編集] 注記

a copyable-box(until C++23)movable-box(since C++23) は、値を持たないのは以下の場合です。

  • `T` が movable または copyable をモデル化せず、それぞれムーブ代入またはコピー代入で例外がスローされる場合、または
  • 別の値を持たないラッパーから初期化/代入された場合。

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アダプタオブジェクト)[編集]
English 日本語 中文(简体) 中文(繁體)