Pregunta ¿Cuál es la diferencia entre 'typedef' y 'using' en C ++ 11?


Sé que en C ++ 11 ahora podemos usar using para escribir un alias tipo, como typedefs:

typedef int MyInt;

Es, por lo que entiendo, equivalente a:

using MyInt = int;

Y esa nueva sintaxis surgió del esfuerzo por tener una forma de expresar "template typedef":

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

Pero, con los primeros dos ejemplos sin plantilla, ¿hay otras diferencias sutiles en el estándar? Por ejemplo, typedefs hacer 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?


663
2018-05-25 02:39


origen


Respuestas:


Son equivalentes, del estándar (énfasis mío) (7.1.3.2):

Un typedef-name también puede ser introducido por una declaración de alias. los   identificador que sigue a la palabra clave using se convierte en un typedef-name y el   atributo-especificador-seq opcional siguiendo el identificador correspondiente   a ese tipodef-nombre. 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.


438
2018-05-25 03:16



los utilizando la sintaxis 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; }

152
2018-04-21 11:39



Son en gran medida lo mismo, excepto que

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


121
2017-10-05 22:58



Ellos son esencialmente lo mismo, pero using proporciona alias templates que es bastante útil. Un buen ejemplo que pude encontrar es el siguiente:

namespace std {
 template<typename T> using add_const_t = typename add_const<T>::type;
}

Entonces, podemos usar std::add_const_t<T> en lugar de typename std::add_const<T>::type


7
2018-03-31 08:20