Namespaces
Variants

std::experimental::ranges:: common_reference

From cppreference.net
Определено в заголовочном файле <experimental/ranges/type_traits>
template < class ... T >
struct common_reference ;
(ranges TS)

Определяет общий ссылочный тип для типов T... , то есть тип, к которому могут быть преобразованы или привязаны все типы в T... . Если такой тип существует (определяется согласно правилам ниже), член type именует этот тип. В противном случае член type отсутствует. Поведение не определено, если любой из типов в T... является неполным типом, за исключением (возможно, cv-квалифицированного) void .

При работе с ссылочными типами, common_reference пытается найти ссылочный тип, к которому можно привязать все предоставленные ссылочные типы, но может вернуть не ссылочный тип, если не сможет найти такой ссылочный тип.

  • Если sizeof... ( T ) равен нулю, член type отсутствует.
  • Если sizeof... ( T ) равен единице (т.е. T... содержит только один тип T0 ), член type обозначает тот же тип, что и T0 .
  • Если sizeof... ( T ) равен двум (т.е. T... содержит два типа T1 и T2 ):
    • Если T1 и T2 являются ссылочными типами и существует простой общий ссылочный тип S для T1 и T2 (как определено ниже), то член 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 обозначает этот тип;
    • Иначе член type отсутствует.
  • Если sizeof... ( T ) больше двух (т.е. T... состоит из типов T1, T2, R... ), то если существует ranges :: common_reference_t < T1, T2 > , член type обозначает ranges :: common_reference_t < ranges :: common_reference_t < T1, T2 > , R... > , если такой тип существует. Во всех остальных случаях член type отсутствует.

Простой общий ссылочный тип двух ссылочных типов T1 и T2 определяется следующим образом:

  • Если T1 является cv1 X & и T2 является cv2 Y & (т.е. оба являются типами lvalue-ссылок): их простой общий ссылочный тип — decltype ( false ? std:: declval < cv12 X & > ( ) : std:: declval < cv12 Y & > ( ) ) , где cv12 — объединение cv1 и cv2 , если такой тип существует и является ссылочным типом.
  • Если T1 и T2 оба являются типами rvalue-ссылок: если существует простой общий ссылочный тип для T1 & и T2 & (определенный согласно предыдущему пункту), то пусть C обозначает соответствующий тип rvalue-ссылки. Если std:: is_convertible < T1, C > :: value и std:: is_convertible < T2, C > :: value оба равны true , то простой общий ссылочный тип для T1 и T2 C .
  • В противном случае один из двух типов должен быть типом lvalue-ссылки A & , а другой — типом rvalue-ссылки B && ( A и B могут быть cv-квалифицированы). Пусть D обозначает простой общий ссылочный тип для A & и B const & , если он существует. Если 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 { } ;
**Примечание:** Весь код C++ внутри тегов ` ` сохранен без изменений, как и требовалось. HTML-разметка и атрибуты также сохранены в оригинальном виде.

Шаблон класса basic_common_reference является точкой настройки, которая позволяет пользователям влиять на результат common_reference для пользовательских типов (обычно прокси-ссылок). Первичный шаблон пуст.

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

Программа может специализировать basic_common_reference<T, U, TQual, UQual> для первых двух параметров T и U если 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 должны обозначать один и тот же тип.

Программа не может специализировать basic_common_reference на третьем или четвертом параметрах, а также не может специализировать common_reference самостоятельно. Программа, добавляющая специализации в нарушение этих правил, имеет неопределенное поведение.

Примечания

Пример

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

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