名前空間
変種
操作

std::experimental::ranges::common_reference

From cppreference.com
< cpp‎ | experimental‎ | ranges
 
 
 
 
汎用ユーティリティライブラリ
ユーティリティコンポーネント
関数オブジェクト
メタプログラミングと型特性
common_reference
タグ付きペアとタプル
                          
タグ指定子
                                      
                          
 
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 のみを含む場合)、メンバ typeT0 と同じ型を指します。
  • sizeof...(T) が 2 の場合(つまり、T... が 2 つの型 T1T2 を含む場合)
    • T1T2 が両方とも参照型であり、T1T2 の *単純共通参照型* S(下記参照)が存在する場合、メンバ型 typeS を指します。
    • それ以外の場合で、basic_common_reference<T1R, T2R, T1Q, T2Q>::type が存在する場合、ここで TiRstd::remove_cv_t<std::remove_reference_t<Ti>> であり、TiQtemplate<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> が存在する場合、メンバ typeranges::common_reference_t<ranges::common_reference_t<T1, T2>, R...> を指します(そのような型が存在する場合)。それ以外の場合、メンバ type はありません。

2 つの参照型 T1T2 の *単純共通参照型* は次のように定義されます。

  • T1cv1 X &T2cv2 Y & (つまり、両方とも lvalue 参照型)の場合:それらの単純共通参照型は decltype(false? std::declval<cv12 X &>() : std::declval<cv12 Y &>()) です。ここで cv12cv1cv2 の和集合であり、そのような型が存在し、参照型である場合。
  • T1T2 が両方とも rvalue 参照型の場合:T1 &T2 & の単純共通参照型(前の箇条書きに従って決定)が存在する場合、C をその型の対応する rvalue 参照型とします。std::is_convertible<T1, C>::valuestd::is_convertible<T2, C>::value が両方とも true の場合、T1T2 の単純共通参照型は C です。
  • それ以外の場合、一方の型は lvalue 参照型 A & で、もう一方は rvalue 参照型 B &&AB は cv 修飾されている可能性があります)でなければなりません。DA &B const & の単純共通参照型(存在する場合)とします。D が存在し、std::is_convertible<B &&, D>::valuetrue の場合、単純共通参照型は 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 つのパラメータ TU に対して basic_common_reference<T, U, TQual, UQual> を特殊化できます。

そのような特殊化が type という名前のメンバを持つ場合、それは public かつ一意のメンバ型であり、TQual<T>UQual<U> の両方に変換可能な型を指している必要があります。さらに、ranges::basic_common_reference<T, U, TQual, UQual>::typeranges::basic_common_reference<U, T, UQual, TQual>::type は同じ型を指す必要があります。

プログラムは、3 番目または 4 番目のパラメータに対して basic_common_reference を特殊化することはできません。また、common_reference 自体を特殊化することもできません。これらの規則に違反して特殊化を追加したプログラムは、未定義の動作をします。

[edit] 注記

[edit]

[edit] 関連項目

型のグループの共通の型を決定する
(クラステンプレート) [編集]
型の共通型を決定します。
(class template) [編集]
2つの型が共通の参照型を共有することを規定する
(concept) [編集]
English 日本語 中文(简体) 中文(繁體)