Namespaces
Variants

Assignable wrapper (C++20)

From cppreference.net
Ranges library
Range adaptors
Helper items
copyable-box
movable-box
(until 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 , (C++23以降) および呼び出し可能オブジェクトを格納するレンジアダプタは、説明専用のクラステンプレート copyable-box (C++23以前) movable-box (C++23以降) によって規定されます。ここに示す名前は説明目的のみのものです。

このラッパーは std:: optional < T > と完全に同じように動作しますが、デフォルトコンストラクタ、コピー代入演算子、ムーブ代入演算子は(条件付きで) std::optional とは異なります。これにより、必要に応じて T に代入可能性が付与され、常に copyable または movable (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 (C++23まで) move_constructible (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 ( /* 下記参照 */ ) ;
(C++20以降)
(C++23まで)
constexpr /*movable-box*/ & operator = ( const /*movable-box*/ & other ) ;
noexcept ( /* 下記参照 */ ) 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 のコピー代入演算子 と同一である。
## 翻訳の特徴 - **HTMLタグ・属性**:完全に保持 - **C++コードブロック**:` `, `
`, ``タグ内のテキストは翻訳せず保持
- **C++専門用語**:`std::copyable`, `copyable-box`, `movable-box`, `emplace`, `reset` などは翻訳せず保持
- **技術的な正確性**:C++の概念や構文を正確に表現する日本語訳
- **フォーマット**:元のHTML構造とインデントを完全に維持
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 オブジェクトを構築する
( std::optional<T> の公開メンバー関数)
含まれている値がある場合、それを破棄する
( std::optional<T> の公開メンバー関数)
内容を代入する
( std::optional<T> の公開メンバー関数)
オブザーバー
含まれている値にアクセスする
( std::optional<T> の公開メンバー関数)
オブジェクトが値を含んでいるかどうかをチェックする
( std::optional<T> の公開メンバー関数)
モディファイア
含まれている値を破棄する
( std::optional<T> の公開メンバー関数)
含まれている値をその場で構築する
( 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) Rangesライブラリ および 制約付きアルゴリズム
202106L (C++20)
(DR)
default-initializable ビュー
202207L (C++23) レンジアダプタ の緩和(move-only型を許可)

不具合報告

以下の動作変更の欠陥報告書は、以前に公開されたC++規格に対して遡及的に適用されました。

DR 適用対象 公開時の動作 正しい動作
P2325R3 C++20 T default_initializable でない場合、デフォルトコンストラクタは
値を含まないラッパーを構築する
ラッパーもまた
default_initializable ではない
LWG 3572 C++20 条件付きで異なる代入演算子がconstexprではなかった constexpr化された

関連項目

指定された値の単一要素を含む view
(クラステンプレート) (カスタマイゼーションポイントオブジェクト)
同じ値を繰り返し生成して作成されるシーケンスからなる view
(クラステンプレート) (カスタマイゼーションポイントオブジェクト)
述語を満たす range の要素から構成される view
(クラステンプレート) (レンジアダプタオブジェクト)
各要素に変換関数を適用するシーケンスの view
(クラステンプレート) (レンジアダプタオブジェクト)
別の view の先頭要素から、述語が false を返す最初の要素までから構成される view
(クラステンプレート) (レンジアダプタオブジェクト)
別の view の要素から、述語が false を返す最初の要素までの初期部分シーケンスをスキップした view
(クラステンプレート) (レンジアダプタオブジェクト)
アダプトされたビューの対応する要素に変換関数を適用した結果から構成される view
(クラステンプレート) (カスタマイゼーションポイントオブジェクト)
アダプトされたビューの隣接する要素に変換関数を適用した結果から構成される view
(クラステンプレート) (レンジアダプタオブジェクト)