Ответ 1
Там нет абсолютно никакой разницы между обоими.
Если вы посмотрите на стандарт:
7.1.3 Спецификатор typedef [dcl.typedef]
Typedef-name также может быть введено объявлением псевдонима. Идентификатор, следующий за ключевым словом
using
становится typedef-name. Он имеет такую же семантику, как если бы он был введен спецификаторомtypedef
. В частности, он не определяет новый тип и не должен появляться в идентификаторе типа.7.3.3 Объявление использования [namespace.udecl]
Если в объявлении использования используется ключевое слово typename и указано зависимое имя (14.6.2), имя, введенное в объявлении использования, обрабатывается как typedef-name.
Однако с этой страницы: http://en.cppreference.com/w/cpp/language/type_alias
Говорят:
Псевдонимы типов похожи на typedef, однако имеют преимущество работы с шаблонами.
Кажется, это
// template type alias
template<class T> using ptr = T*;
// the name 'ptr<T>' is now an alias for pointer to T
ptr<int> x;
возможно только с using
директивы using
.
И не забывайте, что это особенность С++ 11. Некоторые компиляторы пока не поддерживают это.