c++ c++11 typeof decltype

c++ - ¿Diferencia entre decltype y typeof?



c++11 (5)

Bueno, typeof es una extensión no estándar de GNU C que puede usar en GNU C ++ porque GCC le permite usar características de otros idiomas en otro (no siempre, sin embargo), por lo que realmente no deberían compararse.

Por supuesto, pueden existir otras extensiones no estándar para otros compiladores, pero GCC es definitivamente la implementación más documentada.

Para responder a la pregunta: no puede ser obsoleto si nunca fue una característica.

Si desea comparar los méritos de cualquiera de los métodos en C ++, entonces no hay diferencia semántica a menos que esté tratando con referencias. Debe usar decltype porque es portátil y cumple con los estándares.

Dos preguntas con respecto a decltype y typeof :

  • ¿Hay alguna diferencia entre los operadores decltype y typeof ?
  • ¿Se vuelve obsoleto el typeof en C ++ 11?

La diferencia entre los dos es que decltype siempre conserva las referencias como parte de la información, mientras que typeof no puede. Asi que...

int a = 1; int& ra = a; typeof(a) b = 1; // int typeof(ra) b2 = 1; // int decltype(a) b3; // int decltype(ra) b4 = a; // reference to int

El nombre typeof fue la opción preferida (consistente con sizeof y alignof , y el nombre ya usado en las extensiones), pero como puede ver en la propuesta N1478, la preocupación por la compatibilidad con las implementaciones existentes al eliminar las referencias los llevó a darle un nombre distinto.

"Usamos el nombre del operador typeof cuando nos referimos al mecanismo para consultar un tipo de expresión en general. El operador decltype se refiere a la variante propuesta de typeof ... Algunos proveedores de compiladores (EDG, Metrowerks, GCC) proporcionan un operador typeof como una extensión con semántica de caída de referencia. Como se describe en la Sección 4, esto parece ser ideal para expresar el tipo de variables. Por otra parte, la semántica de caída de referencia no proporciona un mecanismo para expresar exactamente los tipos de retorno de genéricos funciones ... En esta propuesta, la semántica del operador que proporciona información del tipo de expresiones refleja el tipo declarado. Por lo tanto, proponemos que el operador se llame decltype ".

J. Jarvi, B. Stroustrup, D. Gregor, J. Siek: Decltype y auto. N1478 / 03-0061.

Por lo tanto, es incorrecto decir que decltype ha obviado completamente typeof (si desea decltype semántica de referencia, entonces la extensión de typeof en esos compiladores todavía tiene uso), sino que, typeof fue obviada en gran medida por él más auto , que elimina las referencias y reemplaza los usos donde Se utilizó typeof para la inferencia variable.


No hay operador typeof en c++ . Si bien es cierto que la mayoría de los compiladores han ofrecido dicha funcionalidad desde hace bastante tiempo, siempre ha sido una extensión de lenguaje específica del compilador. Por lo tanto, comparar el comportamiento de los dos en general no tiene sentido, ya que el comportamiento de typeof (si es que existe) es extremadamente dependiente de la plataforma.

Como ahora tenemos una forma estándar de obtener el tipo de variable / expresión, realmente no hay razón para confiar en extensiones no portátiles, por lo que diría que es bastante obsoleta.

Otra cosa a considerar es que si el comportamiento de typeof no es compatible con decltype para un compilador dado, es posible que la extensión de typeof no tenga mucho desarrollo para abarcar nuevas características de lenguaje en el futuro (lo que significa que simplemente no funcionará). con eg lambdas). No sé si ese es el caso actualmente, pero es una posibilidad distinta.


Para el código heredado, he estado usando con éxito lo siguiente:

#include <type_traits> #define typeof(x) std::remove_reference<decltype((x))>::type


typeof no ha sido estandarizado, aunque fue implementado por varios proveedores de compiladores, por ejemplo, GCC . Se volvió obsoleto con el decltype.

Una buena explicación para las deficiencias de typeof se puede encontrar en esta respuesta relacionada .