c++ - ¿Cuál es la diferencia entre 'typedef' y 'usar' en C ++ 11?



2 Answers

La sintaxis de uso tiene una ventaja cuando se usa dentro de plantillas. Si necesita la abstracción de tipo, pero también necesita mantener el parámetro de la plantilla para poder especificarlo 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; }
c++ c++11 typedef using-declaration

Sé que en C ++ 11 ahora podemos usar using para escribir 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 dos primeros ejemplos sin plantillas, ¿hay otras diferencias sutiles en el estándar? Por ejemplo, typedef s hace aliasing de una manera "débil". Es decir, no crea un nuevo tipo, sino solo un nuevo nombre (las conversiones son implícitas entre esos nombres).

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




Son esencialmente los mismos, pero el using proporciona alias templates que son bastante útiles. Un buen ejemplo que pude encontrar es el siguiente:

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

Por lo tanto, podemos utilizar std::add_const_t<T> lugar de typename std::add_const<T>::type




Related