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 miembrotype. - Si
sizeof...(T)es uno (p. ej.,T...contiene solo un tipoT0), el miembrotypedenomina el mismo tipo queT0. - Si
sizeof...(T)es dos (p. ej.,T...contiene dos tipos,T1yT2):- Si
T1yT2son ambos tipos referencia, y el tipo referencia común simpleSdeT1yT2(como se define posteriormente) existe, entonces el tipo miembrotypedenominaS; - De lo contrario, si
std::basic_common_reference<std::remove_cvref_t<T1>, std::remove_cvref_t<T2>, T1Q, T2Q>::typeexiste, dondeTiQes una plantilla de alias tal queTiQ<U>esUcon la adición de los calificadores-cv y calificadores-ref deTi, entonces el tipo miembrotypedenomina ese tipo; - De lo contrario, si
decltype(false? val<T1>() : val<T2>()), dondevales una plantilla de funcióntemplate<class T> T val();, es un tipo válido, entonces el tipo miembrotypedenomina ese tipo; - De lo contrario, si
std::common_type_t<T1, T2>es un tipo válido, entonces el tipo miembrotypedenomina 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 sistd::common_reference_t<T1, T2>existe, el miembrotypedenotastd::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
T1escv1 X &yT2escv2 Y &(p. ej., ambos son tipos referencia lvalue): su tipo referencia común esdecltype(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
T1yT2son ambos tipos referencia rvalue: si el tipo referencia común simple deT1 &yT2 &(determinado de acuerdo a la viñeta anterior) existe, entonces dejemos queCdenote el tipo referencia rvalue de ese tipo. Si tantostd::is_convertible_v<T1, C>comostd::is_convertible_v<T2, C>sontrue, entonces el tipo referencia común simple deT1yT2esC. - De lo contrario, uno de los dos tipos debe ser un tipo referencia lvalue
A &y el otro debe ser un tipo referencia rvalueB &&(AyBpodrían estar calificados-cv). Dejemos queDdenote el tipo referencia común simple deA &yB const &, si lo hay. SiDexiste ystd::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.
Tipos miembro
| Nombre | Definición |
type
|
El tipo referencia común simple para toda T....
|
Tipos auxiliares
<tbody> </tbody> 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.
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.
Notas
| Esta sección está incompleta |
Ejemplos
| Esta sección está incompleta Razón: sin ejemplo |
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) |