Namespaces
Variants

std::experimental::ranges:: common_reference

From cppreference.net
template < class ... T >
struct common_reference ;
(ranges TS)

T... で指定される型の共通参照型、すなわち T... 内の全ての型が変換またはバインド可能な型を決定します。そのような型が存在する場合(以下のルールに従って決定)、メンバ type はその型を指します。それ以外の場合、メンバ type は存在しません。 T... 内のいずれかの型が(possibly cv-qualified) 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 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 simple common reference type は以下のように定義されます:

  • T1 cv1 X & T2 cv2 Y & の場合(すなわち両方が左辺値参照型の場合): それらの単純な共通参照型は decltype ( false ? std:: declval < cv12 X & > ( ) : std:: declval < cv12 Y & > ( ) ) となります。 ここで cv12 cv1 cv2 の結合であり、その型が存在し参照型である場合に限ります。
  • T1 T2 が両方とも右辺値参照型の場合: T1 & T2 & の単純な共通参照型(前項に従って決定)が存在する場合、 その型に対応する右辺値参照型を C とします。 std:: is_convertible < T1, C > :: value std:: is_convertible < T2, C > :: value が両方とも true の場合、 T1 T2 の単純な共通参照型は C となります。
  • それ以外の場合、一方の型は左辺値参照型 A & で、もう一方は右辺値参照型 B && でなければなりません ( A B は cv 修飾されている可能性があります)。 A & B const & の単純な共通参照型が存在する場合、それを D とします。 D が存在し、 std:: is_convertible < B && , D > :: value true の場合、 単純な共通参照型は D となります。
  • それ以外の場合、単純な共通参照型は存在しません。

目次

メンバー型

名前 定義
type すべての T... に対する共通参照型

ヘルパー型

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 の結果に影響を与えることを可能にするカスタマイゼーションポイントです。プライマリテンプレートは空です。

特殊化

プログラムは、最初の2つのパラメータ T U に対して basic_common_reference<T, U, TQual, UQual> を特殊化してもよい。ただし、 std:: is_same < T, std:: decay_t < T >> std:: is_same < U, std:: decay_t < U >> が両方とも真であり、かつ少なくとも一方がプログラム定義型に依存している場合に限る。

そのような特殊化が type というメンバを持つ場合、それは 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 自体の特殊化も行ってはなりません。これらの規則に違反して特殊化を追加するプログラムの動作は未定義です。

注記

関連項目

型のグループの共通型を決定する
(クラステンプレート)
型の集合の共通型を決定する
(クラステンプレート)
2つの型が共通の参照型を共有することを指定する
(コンセプト)