std::common_reference
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 tipoT0
), el miembrotype
denomina el mismo tipo que T0. - Si sizeof...(T) es dos (p. ej.,
T...
contiene dos tipos,T1
yT2
):- Si
T1
yT2
son ambos tipos referencia, y el tipo referencia común simpleS
deT1
yT2
(como se define posteriormente) existe, entonces el tipo miembrotype
denominaS
; - 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> esU
con la adición de los calificadores-cv y calificadores-ref deTi
, entonces el tipo miembrotype
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 miembrotype
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
- Si sizeof...(T) es mayor que dos (p. ej.,
T...
consiste en los tiposT1, T2, R...
), entonces si std::common_reference_t<T1, T2> existe, el miembrotype
denota std::common_reference_t<std::common_reference_t<T1, T2>, R...> si tal tipo existe. En todos los otros casos, no hay miembrotype
.
El tipo referencia común simple de dos tipos referencia T1
y T2
se define de la manera siguiente:
- Si
T1
escv1 X &
yT2
escv2 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
yT2
son ambos tipos referencia rvalue: si el tipo referencia común simple deT1 &
yT2 &
(determinado de acuerdo a la viñeta anterior) existe, entonces dejemos queC
denote el tipo referencia rvalue de ese tipo. Si tanto std::is_convertible_v<T1, C> como std::is_convertible_v<T2, C> sontrue
, entonces el tipo referencia común simple deT1
yT2
esC
. - De lo contrario, uno de los dos tipos debe ser un tipo referencia lvalue
A &
y el otro debe ser un tipo referencia rvalueB &&
(A
yB
podrían estar calificados-cv). Dejemos queD
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> estrue
, entonces el tipo referencia común simple esD
. - 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
Esta sección está incompleta |
[editar]Ejemplos
Esta sección está incompleta Razón: sin ejemplo |
[editar]Véase también
(C++11) | Deduce el tipo del resultado de una expresión aritmética mixta (plantilla de clase) |
(C++20) | Especifica que dos tipos comparte un tipo de referencia común. (concepto) |