std::experimental::ranges::common_reference
| Defined in header <experimental/ranges/type_traits> |
||
| template< class... T > struct common_reference; |
(ranges TS) | |
型 T... の共通参照型を決定します。つまり、T... 内のすべての型が変換または束縛される可能性のある型です。そのような型が存在する場合(下記の規則に従って決定)、メンバ type はその型を指します。存在しない場合は、メンバ type はありません。T... 内の型のいずれかが、(おそらく cv 修飾された)void 以外の不完全型である場合、動作は未定義です。
参照型が与えられた場合、common_reference は、提供された参照型がすべて束縛される可能性のある参照型を見つけようとしますが、そのような参照型が見つからない場合は参照型でない型を返すことがあります。
- sizeof...(T) がゼロの場合、メンバー
typeは存在しません。 sizeof...(T)が 1 の場合(つまり、T...が単一の型T0のみを含む場合)、メンバtypeはT0と同じ型を指します。sizeof...(T)が 2 の場合(つまり、T...が 2 つの型T1とT2を含む場合)T1とT2が両方とも参照型であり、T1とT2の *単純共通参照型*S(下記参照)が存在する場合、メンバ型typeはSを指します。- それ以外の場合で、
basic_common_reference<T1R, T2R, T1Q, T2Q>::typeが存在する場合、ここでTiRはstd::remove_cv_t<std::remove_reference_t<Ti>>であり、TiQはtemplate<class T> TiQ<TiR>がTiであるようなエイリアステンプレートである場合、メンバ型typeはその型を指します。 - それ以外の場合で、
decltype(false? val<T1>() : val<T2>())(ここでvalは関数テンプレートtemplate<class T> T val();)が有効な型を示す場合、メンバ型typeはその型を指します。 - それ以外の場合で、
ranges::common_type_t<T1, T2>が有効な型である場合、メンバ型typeはその型を指します。 - それ以外の場合、メンバ型はありません。
sizeof...(T)が 2 より大きい場合(つまり、T...が型T1, T2, R...で構成される場合)、ranges::common_reference_t<T1, T2>が存在する場合、メンバtypeはranges::common_reference_t<ranges::common_reference_t<T1, T2>, R...>を指します(そのような型が存在する場合)。それ以外の場合、メンバtypeはありません。
2 つの参照型 T1 と T2 の *単純共通参照型* は次のように定義されます。
T1がcv1 X &でT2がcv2 Y &(つまり、両方とも lvalue 参照型)の場合:それらの単純共通参照型はdecltype(false? std::declval<cv12 X &>() : std::declval<cv12 Y &>())です。ここで cv12 は cv1 と cv2 の和集合であり、そのような型が存在し、参照型である場合。T1とT2が両方とも rvalue 参照型の場合:T1 &とT2 &の単純共通参照型(前の箇条書きに従って決定)が存在する場合、Cをその型の対応する rvalue 参照型とします。std::is_convertible<T1, C>::valueとstd::is_convertible<T2, C>::valueが両方ともtrueの場合、T1とT2の単純共通参照型はCです。- それ以外の場合、一方の型は lvalue 参照型
A &で、もう一方は rvalue 参照型B &&(AとBは cv 修飾されている可能性があります)でなければなりません。DをA &とB const &の単純共通参照型(存在する場合)とします。Dが存在し、std::is_convertible<B &&, D>::valueがtrueの場合、単純共通参照型はDです。 - それ以外の場合、単純共通参照型はありません。
目次 |
[edit] メンバ型
| 名前 | 定義 |
type
|
すべての T... の共通参照型 |
[edit] ヘルパー型
| template< class... T > using common_reference_t = typename common_reference<T...>::type; |
||
| template< class T, class U, template<class> class TQual, template<class> class UQual > struct basic_common_reference {}; |
||
クラステンプレート basic_common_reference は、ユーザー定義型(通常はプロキシ参照)の common_reference の結果に影響を与えるためのカスタマイズポイントです。プライマリテンプレートは空です。
[edit] 特殊化
プログラムは、std::is_same<T, std::decay_t<T>> と std::is_same<U, std::decay_t<U>> が両方とも真であり、かつ少なくとも一方がプログラム定義型に依存する場合に、最初の 2 つのパラメータ T と U に対して basic_common_reference<T, U, TQual, UQual> を特殊化できます。
そのような特殊化が type という名前のメンバを持つ場合、それは public かつ一意のメンバ型であり、TQual<T> と UQual<U> の両方に変換可能な型を指している必要があります。さらに、ranges::basic_common_reference<T, U, TQual, UQual>::type と ranges::basic_common_reference<U, T, UQual, TQual>::type は同じ型を指す必要があります。
プログラムは、3 番目または 4 番目のパラメータに対して basic_common_reference を特殊化することはできません。また、common_reference 自体を特殊化することもできません。これらの規則に違反して特殊化を追加したプログラムは、未定義の動作をします。
[edit] 注記
| このセクションは未完成です |
[edit] 例
| このセクションは未完成です 理由: 例がありません |
[edit] 関連項目
| (C++11) |
型のグループの共通の型を決定する (クラステンプレート) |
| 型の共通型を決定します。 (class template) | |
| 2つの型が共通の参照型を共有することを規定する (concept) |