std::experimental::ranges:: common_reference
|
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
自体の特殊化も行ってはなりません。これらの規則に違反して特殊化を追加するプログラムの動作は未定義です。
注記
| このセクションは不完全です |
例
|
このセクションは不完全です
理由: 例がありません |
関連項目
|
(C++11)
|
型のグループの共通型を決定する
(クラステンプレート) |
|
型の集合の共通型を決定する
(クラステンプレート) |
|
|
2つの型が共通の参照型を共有することを指定する
(コンセプト) |