2012-05-25 36 views
598

sé que en C++ 11 ahora podemos utilizar para escribir using tipo de alias, como typedef s:¿Cuál es la diferencia entre 'typedef' y 'using' en C++ 11?

typedef int MyInt; 

Es, por lo que entiendo, lo que equivale a:

using MyInt = int; 

Y eso nueva sintaxis surgido del esfuerzo para tener una forma de expresar "template typedef":

template< class T > using MyType = AnotherType< T, MyAllocatorType >; 

Pero, con los dos primeros no t ejemplos concretos, ¿hay otras diferencias sutiles en el estándar? Por ejemplo, typedef s aliasing de una manera "débil". Es decir, no crea un tipo nuevo, sino solo un nombre nuevo (las conversiones están implícitas entre esos nombres).

¿Es lo mismo con using o genera un nuevo tipo? ¿Hay alguna diferencia?

+145

Yo personalmente prefiero la nueva sintaxis, porque es mucho más similar a la asignación de variables regular, mejorar la legibilidad. Por ejemplo, ¿prefieres 'typedef void (& MyFunc) (int, int);' o 'usando MyFunc = void (int, int);'? –

+3

Estoy completamente de acuerdo, solo uso la nueva sintaxis ahora. Es por eso que preguntaba, para estar seguro de que realmente no hay diferencia. – Klaim

+56

@MatthieuM. esos dos son diferentes por cierto. Debería ser 'typedef void MyFunc (int, int);' (que en realidad no se ve tan mal), o 'usando MyFunc = void (&) (int, int);' –

Respuesta

401

son equivalentes, desde el estándar (énfasis) (7.1.3.2):

A typedef-nombre también puede ser introducido por un alias-declaración. El identificador que sigue a la palabra clave using se convierte en un typedef-name y el atributo-specifier-seq opcional siguiendo el identificador pertenece a ese typedef-name. Tiene la misma semántica que si fuera introducido por el especificador typedef. En particular, no define un nuevo tipo y no aparecerá en el id. De tipo.

+14

De la respuesta, la palabra clave 'using' parece ser un superconjunto de' typedef'. Entonces, ¿se desaprobará 'typdef' en el futuro? – iammilind

+0

Eso lo deja claro. – Klaim

+4

@iammilind probablemente no, pero puedes codificar como si fuera. – bames53

139

La sintaxis con tiene una ventaja cuando se usa dentro de las plantillas. Si necesita la abstracción de tipo, pero también necesita mantener el parámetro de la plantilla para poder especificarse en el futuro. Deberías escribir algo como esto.

template <typename T> struct whatever {}; 

template <typename T> struct rebind 
{ 
    typedef whatever<T> type; // to make it possible to substitue the whatever in future. 
}; 

rebind<int>::type variable; 

template <typename U> struct bar { typename rebind<U>::type _var_member; } 

Pero utilizando la sintaxis simplifica este caso de uso.

template <typename T> using my_type = whatever<T>; 

my_type<int> variable; 
template <typename U> struct baz { my_type<U> _var_member; } 
+20

Aunque ya señalé esto en la pregunta. Mi pregunta es si no usas plantilla, ¿hay alguna diferencia con typedef? Como, por ejemplo, cuando usas 'Foo foo {init_value};' en lugar de 'Foo foo (init_value)' se supone que ambos hacen lo mismo, pero no cubren exactamente las mismas reglas. Entonces me preguntaba si había una diferencia oculta similar con el uso de/typedef. – Klaim

101

Ellos son básicamente el mismo, excepto que

The alias declaration is compatible with templates, whereas the C style typedef is not.

+12

Particularmente aficionado a la simplicidad de la respuesta y señalando el origen de tipografía. – g24l

Cuestiones relacionadas