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


Answers

La sintaxis de uso 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 el uso de 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; }
Question

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

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, 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?




Son esencialmente lo mismo, pero el 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> lugar de typename std::add_const<T>::type




Related