Namespaces
Variants

std::experimental::ranges:: common_type

From cppreference.net
Определено в заголовочном файле <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 нет.
  • Если 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 ;
**Примечание:** Весь код внутри тегов ` ` сохранен без изменений, так как содержит C++ код, который не должен переводиться согласно инструкциям. HTML структура и атрибуты также сохранены в оригинальном виде.

Специализации

Пользователи могут специализировать 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 ( ) .

Пример

Смотрите также

определяет общий тип группы типов
(шаблон класса)
определяет общий ссылочный тип набора типов
(шаблон класса)