std::experimental::ranges:: common_type
|
Определено в заголовочном файле
<experimental/ranges/type_traits>
|
||
|
template
<
class
...
T
>
struct common_type ; |
(ranges TS) | |
Определяет общий тип среди всех типов
T...
, то есть тип, в который все
T...
могут быть неявно преобразованы. Если такой тип существует (определяется согласно правилам ниже), член
type
называет этот тип. В противном случае член
type
отсутствует. Поведение не определено, если любой из типов в
T...
является неполным типом, за исключением (возможно, cv-квалифицированного)
void
.
-
Если
sizeof...
(
T
)
равен нулю, член
typeотсутствует. -
Если
sizeof...
(
T
)
равен единице (т.е.
T...содержит только один типT0), членtypeобозначает тот же тип, что и std:: decay_t < T0 > . -
Если
sizeof...
(
T
)
равен двум (т.е.
T...содержит ровно два типаT1иT2),
-
-
Если применение
std::decay
хотя бы к одному из
T1иT2даёт другой тип, член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
>
является корректным, то член
typeобозначает этот тип; -
Иначе член
typeобозначает тип std:: decay_t < decltype ( false ? std:: declval < const T1 & > ( ) : std:: declval < const T2 & > ( ) ) > , если это условное выражение корректно; в противном случае членаtypeнет.
-
Если применение
std::decay
хотя бы к одному из
-
Если
sizeof...
(
T
)
больше двух (т.е.,
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 ; |
||
Специализации
Пользователи могут специализировать
common_type
для типов
T1
и
T2
если
-
По крайней мере один из
T1иT2зависит от пользовательского типа, и -
std::decay
является тождественным преобразованием для обоих
T1иT2.
Если такая специализация имеет член с именем
type
, он должен быть публичным и однозначным типом-членом, который обозначает cv-неквалифицированный нессылочный тип, к которому оба типа
T1
и
T2
явно преобразуемы. Кроме того,
ranges
::
common_type_t
<
T1, T2
>
и
ranges
::
common_type_t
<
T2, T1
>
должны обозначать один и тот же тип.
Программа, которая добавляет специализации
common_type
в нарушение этих правил, имеет неопределённое поведение.
Примечания
Для арифметических типов, не подвергающихся продвижению, общий тип можно рассматривать как тип (возможно, смешанного режима) арифметического выражения, такого как T0 ( ) + T1 ( ) + ... + Tn ( ) .
Пример
|
Этот раздел не завершён
Причина: отсутствует пример |
Смотрите также
|
(C++11)
|
определяет общий тип группы типов
(шаблон класса) |
|
определяет общий ссылочный тип набора типов
(шаблон класса) |