std:: common_reference
|
ヘッダーで定義
<type_traits>
|
||
|
template
<
class
...
T
>
struct common_reference ; |
(C++20以降) | |
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を含む場合):-
型
SをT1とT2の 単純共通参照型 (下記で定義)とする。以下の条件が全て満たされる場合、メンバ型typeはSを示す:-
T1とT2が両方とも参照型である -
Sが適正に形成される
-
-
型
|
(C++23以降) |
-
-
それ以外の場合、
std
::
basic_common_reference
<
std::
remove_cvref_t
<
T1
>
,
std::
remove_cvref_t
<
T2
>
, T1Q, T2Q
>
::
type
が存在し、ここで
TiQは TiQ < U > がUにTiのCV修飾子と参照修飾子を追加したものとなる単項エイリアステンプレートである場合、メンバ型typeはその型を指す;
-
それ以外の場合、
std
::
basic_common_reference
<
std::
remove_cvref_t
<
T1
>
,
std::
remove_cvref_t
<
T2
>
, T1Q, T2Q
>
::
type
が存在し、ここで
-
-
それ以外の場合、
decltype
(
false
?
val
<
T1
>
(
)
:
val
<
T2
>
(
)
)
が有効な型である場合(ここで
valは関数テンプレート template < class T > T val ( ) ; である)、メンバ型typeはその型を表す; -
それ以外の場合、
std::
common_type_t
<
T1, T2
>
が有効な型である場合、メンバ型
typeはその型を表す; -
それ以外の場合、メンバ
typeは存在しない。
-
それ以外の場合、
decltype
(
false
?
val
<
T1
>
(
)
:
val
<
T2
>
(
)
)
が有効な型である場合(ここで
-
sizeof...
(
T
)
が2より大きい場合(すなわち
T...が型T1, T2, R...から構成される場合)、 std :: common_reference_t < T1, T2 > が存在するとき、メンバtypeは std :: common_reference_t < std :: 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_v < T1, C > と std:: is_convertible_v < T2, C > が両方とも true である場合、T1とT2の単純な共通参照型はCである。 -
それ以外の場合、一方の型は左辺値参照型
A&で、他方は右辺値参照型B&&でなければならない(AとBはCV修飾されていてもよい)。 A & と B const & の単純な共通参照型が存在する場合、それをDとする。 D が存在し、かつ std:: is_convertible_v < B && , D > が true である場合、単純な共通参照型はDである。 - それ以外の場合、単純な共通参照型は存在しない。
上記で使用されているような false ? X : Y という式の型の定義については、 条件演算子 を参照してください。
目次 |
メンバー型
| 名前 | 定義 |
type
|
すべての
T...
に対する共通参照型
|
ヘルパー型
|
template
<
class
...
T
>
using common_reference_t = std :: 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
に対して
std
::
basic_common_reference
<
T, U, TQual, UQual
>
を特殊化してもよい。ただし、
std::
is_same_v
<
T,
std::
decay_t
<
T
>>
と
std::
is_same_v
<
U,
std::
decay_t
<
U
>>
がともに
true
であり、かつ少なくとも一方がプログラム定義型に依存している場合に限る。
そのような特殊化が
type
というメンバを持つ場合、それは
TQual
<
T
>
と
UQual
<
U
>
の両方が変換可能な型を指す、公開かつ明確なメンバでなければなりません。さらに、
std
::
basic_common_reference
<
T, U, TQual, UQual
>
::
type
と
std
::
basic_common_reference
<
U, T, UQual, TQual
>
::
type
は同じ型を示さなければなりません。
プログラムは3番目または4番目のパラメータに対する
basic_common_reference
の特殊化を行ってはならず、
common_reference
自体の特殊化も行ってはなりません。これらの規則に違反して特殊化を追加するプログラムの動作は未定義です。
標準ライブラリは以下の特殊化を提供します:
basic_common_reference
:
2つの
pair
の共通参照型を決定する
(クラステンプレートの特殊化) |
|
tuple
と
tuple-like
型の共通参照型を決定する
(クラステンプレートの特殊化) |
|
reference_wrapper
と非
reference_wrapper
の共通参照型を決定する
(クラステンプレートの特殊化) |
注記
| 機能テスト マクロ | 値 | 標準 | 機能 |
|---|---|---|---|
__cpp_lib_common_reference
|
202302L
|
(C++23) | std::common_reference_t の std::reference_wrapper を参照型にする |
例
#include <concepts> #include <type_traits> static_assert( std::same_as< int&, std::common_reference_t< std::add_lvalue_reference_t<int>, std::add_lvalue_reference_t<int>&, std::add_lvalue_reference_t<int>&&, std::add_lvalue_reference_t<int>const, std::add_lvalue_reference_t<int>const& > > ); int main() {}
関連項目
|
(C++11)
|
型のグループの共通型を決定する
(クラステンプレート) |
|
(C++20)
|
2つの型が共通の参照型を共有することを指定する
(コンセプト) |