tienen diferentes orígenes y diferentes usos.
typedef
proviene de C
: Recordamos que la forma en C para declarar una estructura es:
typedef struct _MyStruct { .... } MyStruct;
Se le permite presentarse un alias por sólo un tipo. Puede ser utilizado para el tipo de función, con una sintaxis torpe ...
typedef void (*Func)(Foo, Bar);
Dónde Func
ahora es un puntero a una función de tomar dos argumentos por copia (de tipos Foo
y Bar
respectivamente) y devolver nada .
using
tiene, originalmente, un significado diferente. Está destinado a inyectar un nombre en un ámbito. Cualquier nombre (casi) puede ser inyectado: tipos, funciones, variables (pero no valores enum ...)
Con C++ 11, la sintaxis se ha mejorado para permitir plantilla aliasing:
template <typename T>
using equiv_map = std::map<T,T>;
Esta powered-up using
significa que aliasing (ver abajo), ahora es posible, en la parte superior de las funcionalidades anteriores .
Este cambio de C++ 11 es una dirección clara hacia la armonización de la sintaxis. Nótese cómo la definición de un alias es ahora similar a la definición de una variable:
<name> = <expression>;
Por desgracia parece que el estándar reservada esta aliasing a las situaciones de la plantilla, así que por ahora tanto
typedef
y
using
coexisten, cada uno con su propia coto de caza.
¿Existe una diferencia real? En particular, a la luz de la declaración mejorada de C++ 11 'using' que permite definir alias con plantillas. –
Hay al menos una diferencia para los tipos de plantilla. Solo puede 'typedef' un tipo especializado, como' vector ', y puede usar' using' solo en la plantilla no especializada ('vector', por ejemplo) –
jalf
Si tiene un grupo de operadores sobrecargados que desea import, 'typedef' no funciona en este caso porque tiene que estar usando' using'! – AraK