Namespaces
Variants

std::experimental::ranges:: common_reference

From cppreference.net
Definido en el encabezado <experimental/ranges/type_traits>
template < class ... T >
struct common_reference ;
(ranges TS)

Determina el tipo de referencia común de los tipos T... , es decir, el tipo al que todos los tipos en T... pueden ser convertidos o vinculados. Si existe tal tipo (determinado de acuerdo con las reglas siguientes), el miembro type nombra ese tipo. De lo contrario, no existe el miembro type . El comportamiento es indefinido si alguno de los tipos en T... es un tipo incompleto distinto de (posiblemente calificado cv) void .

Cuando se proporcionan tipos de referencia, common_reference intenta encontrar un tipo de referencia al que todos los tipos de referencia suministrados puedan enlazarse, pero puede devolver un tipo no referencia si no puede encontrar dicho tipo de referencia.

  • Si sizeof... ( T ) es cero, no existe el miembro type .
  • Si sizeof... ( T ) es uno (es decir, T... contiene solo un tipo T0 ), el miembro type denomina el mismo tipo que T0 .
  • Si sizeof... ( T ) es dos (es decir, T... contiene dos tipos T1 y T2 ):
    • Si T1 y T2 son ambos tipos referencia, y existe el tipo de referencia común simple S de T1 y T2 (según se define a continuación), entonces el tipo miembro type denomina S ;
    • En caso contrario, si existe basic_common_reference < T1R, T2R, T1Q, T2Q > :: type , donde TiR es std:: remove_cv_t < std:: remove_reference_t < Ti >> y TiQ es una plantilla de alias tal que TiQ < TiR > es Ti , entonces el tipo miembro type denomina ese tipo;
    • En caso contrario, si decltype ( false ? val < T1 > ( ) : val < T2 > ( ) ) , donde val es una plantilla de función template < class T > T val ( ) ; , denota un tipo válido, entonces el tipo miembro type denomina ese tipo;
    • En caso contrario, si ranges:: common_type_t < T1, T2 > es un tipo válido, entonces el tipo miembro type denomina ese tipo;
    • En caso contrario, no existe el tipo miembro.
  • Si sizeof... ( T ) es mayor que dos (es decir, T... consiste en los tipos T1, T2, R... ), entonces si existe ranges :: common_reference_t < T1, T2 > , el miembro type denota ranges :: common_reference_t < ranges :: common_reference_t < T1, T2 > , R... > si existe tal tipo. En todos los demás casos, no existe el miembro type .

El tipo de referencia común simple de dos tipos de referencia T1 y T2 se define de la siguiente manera:

  • Si T1 es cv1 X & y T2 es cv2 Y & (es decir, ambos son tipos de referencia lvalue): su tipo de referencia común simple es decltype ( false ? std:: declval < cv12 X & > ( ) : std:: declval < cv12 Y & > ( ) ) , donde cv12 es la unión de cv1 y cv2 , si ese tipo existe y es un tipo de referencia.
  • Si T1 y T2 son ambos tipos de referencia rvalue: si existe el tipo de referencia común simple de T1 & y T2 & (determinado según el punto anterior), entonces sea C el tipo de referencia rvalue correspondiente a ese tipo. Si std:: is_convertible < T1, C > :: value y std:: is_convertible < T2, C > :: value son ambos true , entonces el tipo de referencia común simple de T1 y T2 es C .
  • De lo contrario, uno de los dos tipos debe ser un tipo de referencia lvalue A & y el otro debe ser un tipo de referencia rvalue B && ( A y B pueden estar calificados con cv). Sea D el tipo de referencia común simple de A & y B const & , si existe. Si D existe y std:: is_convertible < B && , D > :: value es true , entonces el tipo de referencia común simple es D .
  • De lo contrario, no existe un tipo de referencia común simple.

Contenidos

Tipos de miembros

Nombre Definición
type el tipo de referencia común para todos T...

Tipos auxiliares

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 { } ;

La plantilla de clase basic_common_reference es un punto de personalización que permite a los usuarios influir en el resultado de common_reference para tipos definidos por el usuario (típicamente referencias proxy). La plantilla principal está vacía.

Especializaciones

Un programa puede especializar basic_common_reference<T, U, TQual, UQual> en los dos primeros parámetros T y U si std:: is_same < T, std:: decay_t < T >> y std:: is_same < U, std:: decay_t < U >> son ambos verdaderos y al menos uno de ellos depende de un tipo definido por el programa.

Si tal especialización tiene un miembro llamado type , debe ser un tipo de miembro público y no ambiguo que nombre un tipo al cual tanto TQual < T > como UQual < U > sean convertibles. Adicionalmente, ranges :: basic_common_reference < T, U, TQual, UQual > :: type y ranges :: basic_common_reference < U, T, UQual, TQual > :: type deben denotar el mismo tipo.

Un programa no puede especializar basic_common_reference en el tercer o cuarto parámetro, ni puede especializar common_reference mismo. Un programa que añade especializaciones violando estas reglas tiene comportamiento indefinido.

Notas

Ejemplo

Véase también

determina el tipo común de un grupo de tipos
(plantilla de clase)
determina el tipo común de un conjunto de tipos
(plantilla de clase)
especifica que dos tipos comparten un tipo de referencia común
(concepto)