std::experimental::ranges:: common_type
|
template
<
class
...
T
>
struct common_type ; |
(ranges TS) | |
すべての型
T...
に共通する型、すなわちすべての
T...
が暗黙的に変換可能な型を決定します。そのような型が存在する場合(以下の規則に従って決定)、メンバ
type
はその型を示します。それ以外の場合、メンバ
type
は存在しません。
T...
内のいずれかの型が(修飾された可能性のある)
void
以外の不完全型である場合、動作は未定義です。
-
sizeof...
(
T
)
がゼロの場合、メンバ
typeは存在しません。 -
sizeof...
(
T
)
が1の場合(すなわち
T...が単一の型T0のみを含む場合)、メンバtypeは std:: decay_t < T0 > と同じ型を示します。 -
sizeof...
(
T
)
が2の場合(すなわち
T...が正確に2つの型T1とT2を含む場合)、
-
-
T1とT2の少なくとも一方に std::decay を適用した結果が元の型と異なる場合、メンバtypeは ranges :: common_type_t < std:: decay_t < T1 > , std:: decay_t < T2 >> と同じ型を表す(存在する場合)。存在しない場合、メンバtypeは存在しない。 -
それ以外の場合(かつ
ranges
::
common_type
<
T1, T2
>
に対するユーザー特殊化が存在しない場合)、
std::
common_type_t
<
T1, T2
>
が well-formed であれば、メンバ
typeはその型を表す。 -
それ以外の場合、メンバ
typeは std:: decay_t < decltype ( false ? std:: declval < const T1 & > ( ) : std:: declval < const T2 & > ( ) ) > の型を表す(その条件式が well-formed である場合)。そうでない場合、メンバtypeは存在しない。
-
-
sizeof...
(
T
)
が2より大きい場合(すなわち、
T...が型T1, T2, R...で構成される場合)、 ranges :: common_type_t < T1, T2 > が存在するならば、メンバtypeは ranges :: common_type_t < ranges :: common_type_t < T1, T2 > , R... > を表す(そのような型が存在する場合)。それ以外の場合、メンバtypeは存在しない。
目次 |
メンバー型
| 名前 | 定義 |
type
|
すべての
T...
に対する共通型
|
ヘルパー型
|
template
<
class
...
T
>
using common_type_t = typename common_type < T... > :: type ; |
||
特殊化
ユーザーは型
T1
と
T2
に対して
common_type
を特殊化することができます。
-
T1とT2の少なくとも一方がユーザー定義型に依存しており、かつ -
std::decay
が
T1とT2の両方に対して恒等変換である。
そのような特殊化が
type
という名前のメンバを持つ場合、それは
T1
と
T2
の両方が明示的に変換可能な、CV修飾されていない非参照型を指す、公開かつ明確なメンバ型でなければなりません。さらに、
ranges
::
common_type_t
<
T1, T2
>
と
ranges
::
common_type_t
<
T2, T1
>
は同じ型を示さなければなりません。
これらの規則に違反して
common_type
の特殊化を追加するプログラムは未定義動作となります。
注記
プロモーションの対象とならない算術型の場合、共通型は以下のような(混合モードの可能性がある)算術式の型と見なすことができます: T0 ( ) + T1 ( ) + ... + Tn ( ) 。
例
|
このセクションは不完全です
理由: 例がありません |
関連項目
|
(C++11)
|
型のグループの共通型を決定する
(クラステンプレート) |
|
型の集合の共通参照型を決定する
(クラステンプレート) |