Nie ma absolutnie żadnej różnicy między oboma.
Jeśli spojrzeć na normy:
7.1.3 [dcl.typedef]
typedef-name może być również wprowadzony przez typedef specy fi er alias-deklaracja. Identyfikator po słowie kluczowym using
staje się typedef-name. Ma taką samą semantykę, jak gdyby została wprowadzona przez specyfikator typedef
. W szczególności nie definiuje nowego typu i nie może się pojawić w identyfikatorze typu .
7.3.3 Zgłoszenie pomocą [namespace.udecl]
Jeżeli pomocą deklaracja używa słowa kluczowego typeName i określa nazwę zależną (14.6.2), nazwy wprowadzonej przez Użycie deklaracji jest traktowane jako typedef-name.
Jednak od tej strony: http://en.cppreference.com/w/cpp/language/type_alias
Mówi się:
Rodzaj pseudonimy są podobne do typedefs, mają jednak tę zaletę pracy z szablonami.
To wydaje się, że w ten sposób:
// template type alias
template<class T> using ptr = T*;
// the name 'ptr<T>' is now an alias for pointer to T
ptr<int> x;
jest możliwe tylko z dyrektywą using
.
I nie zapominaj, że jest to funkcja C++ 11. Niektóre kompilatory jeszcze tego nie obsługują.