c++ - que - typedef float




Qual é a diferença entre 'typedef' e 'using' em C++ 11? (3)

A sintaxe de uso tem uma vantagem quando usada em modelos. Se você precisar de abstração de tipo, mas também precisa manter o parâmetro de modelo para ser possível ser especificado no futuro. Você deveria escrever algo assim.

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; }

Mas o uso da sintaxe simplifica esse 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; }

Eu sei que em C ++ 11 agora podemos usar using para escrever alias de tipo, como typedef s:

typedef int MyInt;

É, pelo que entendi, equivalente a:

using MyInt = int;

E essa nova sintaxe emergiu do esforço de ter uma maneira de expressar " template typedef ":

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

Mas, com os dois primeiros exemplos sem modelo, existem outras diferenças sutis no padrão? Por exemplo, typedef s faz o aliasing de uma maneira "fraca". Ou seja, ele não cria um novo tipo, mas apenas um novo nome (as conversões estão implícitas entre esses nomes).

É o mesmo com o using ou gera um novo tipo? Existem diferenças?


Eles são basicamente os mesmos, exceto que:

A declaração de alias é compatível com modelos, enquanto o typedef de estilo C não é.


Eles são essencialmente os mesmos, mas o using fornece alias templates que é bastante útil. Um bom exemplo que pude encontrar é o seguinte:

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

Portanto, podemos usar std::add_const_t<T> vez de typename std::add_const<T>::type





using-declaration