Espacios de nombres
Variantes
Acciones

std::common_reference

De cppreference.com
< cpp‎ | types
 
 
Biblioteca de servicios
 
Apoyo de tipos
Propiedades de tipos
(C++11)
(C++11)
(C++14)
(C++11)
(C++11)(hasta C++20)
(C++11)(en desuso en C++20)
(C++11)
Constantes de rasgos de tipos
Metafunciones
(C++17)
Contexto de evaluación constante
Operaciones soportadas
Relaciones y consultas de propiedades
Modificaciones de tipos
Transformaciones de tipos
(C++11)
(C++11)
(C++17)
common_reference
(C++20)
(C++11)(hasta C++20)(C++17)
 
Definido en el archivo de encabezado <type_traits>
template<class... T>
struct common_reference;
(desde C++20)

Determina el tipo referencia común de los tipos T..., es decir, el tipo al cual todos los tipos en T... pueden convertirse o vincularse. Si tal tipo existe (determinado de acuerdo a las reglas posteriores), el miembro type denomina ese tipo. De lo contrario, no hay un miembro type. El comportamiento está indefinido si cualquiera de los tipos en T... es un tipo incompleto que no sea (posiblemente calificado-cv) void.

Cuando se le dan tipos referencia, common_reference intenta encontrar un tipo referencia al que todos los tipos referencia proporcionados puedan estar vinculados, pero puede devolver un tipo que no sea de referencia si no puede encontrar dicho tipo referencia.

  • Si sizeof...(T) es cero, no hay miembro type.
  • Si sizeof...(T) es uno (p. ej., T... contiene solo un tipo T0), el miembro type denomina el mismo tipo que T0.
  • Si sizeof...(T) es dos (p. ej., T... contiene dos tipos, T1 y T2):
    • Si T1 y T2 son ambos tipos referencia, y el tipo referencia común simpleS de T1 y T2 (como se define posteriormente) existe, entonces el tipo miembro type denomina S;
    • De lo contrario, si std::basic_common_reference<std::remove_cvref_t<T1>, std::remove_cvref_t<T2>, T1Q, T2Q>::type existe, donde TiQ es una plantilla de alias tal que TiQ<U> es U con la adición de los calificadores-cv y calificadores-ref de Ti, entonces el tipo miembro type denomina ese tipo;
    • De lo contrario, si decltype(false? val<T1>(): val<T2>()), donde val es una plantilla de función template<class T> T val();, es un tipo válido, entonces el tipo miembro type denomina ese tipo;
    • De lo contrario, si std::common_type_t<T1, T2> es un tipo válido, entonces el tipo miembro type denomina ese tipo;
    • De lo contrario, no hay un miembro type.
  • Si sizeof...(T) es mayor que dos (p. ej., T... consiste en los tipos T1, T2, R...), entonces si std::common_reference_t<T1, T2> existe, el miembro type denota std::common_reference_t<std::common_reference_t<T1, T2>, R...> si tal tipo existe. En todos los otros casos, no hay miembro type.

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

  • Si T1 es cv1 X & y T2 es cv2 Y & (p. ej., ambos son tipos referencia lvalue): su tipo referencia común 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 referencia;
  • Si T1 y T2 son ambos tipos referencia rvalue: si el tipo referencia común simple de T1 & y T2 & (determinado de acuerdo a la viñeta anterior) existe, entonces dejemos que C denote el tipo referencia rvalue de ese tipo. Si tanto std::is_convertible_v<T1, C> como std::is_convertible_v<T2, C> son true, entonces el tipo referencia común simple de T1 y T2 es C.
  • De lo contrario, uno de los dos tipos debe ser un tipo referencia lvalue A & y el otro debe ser un tipo referencia rvalue B && (A y B podrían estar calificados-cv). Dejemos que D denote el tipo referencia común simple de A & y B const&, si lo hay. Si D existe y std::is_convertible_v<B&&, D> es true, entonces el tipo referencia común simple es D.
  • De lo contrario, no existe un tipo referencia común simple.

Contenido

[editar]Tipos miembro

Nombre Definición
type El tipo referencia común simple para toda T....

[editar]Tipos auxiliares

template<class... T>
using common_reference_t =typename std::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 (normalmente referencias proxy). La plantilla principal está vacía.

[editar]Especializaciones

Un programa puede especializar a 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 dicha especialización tiene un miembro llamado type, debe ser un tipo miembro público e inequívoco que nombre un tipo al que tanto TQual<T> como UQual<U> son convertibles. Además, std::basic_common_reference<T, U, TQual, UQual>::type y std::basic_common_reference<U, T, UQual, TQual>::type deben denotar el mismo tipo.

Un programa no puede especializar a basic_common_reference en el tercer o cuarto parámetro, ni puede especializar a common_reference. Un programa que agrega especializaciones en violación de estas reglas tiene un comportamiento indefinido.

[editar]Notas

[editar]Ejemplos

[editar]Véase también

Deduce el tipo del resultado de una expresión aritmética mixta
(plantilla de clase)[editar]
Especifica que dos tipos comparte un tipo de referencia común.
(concepto)[editar]
close