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
ytypeof
? - ¿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 .