Они имеют различное происхождение и различное использование.
typedef
происходит от C
: напомним, что способ объявления структуры в C:
typedef struct _MyStruct { .... } MyStruct;
Itпозволяет ввести псевдоним только для типа .Его можно использовать для типа функции с неудобным синтаксисом ...
typedef void (*Func)(Foo, Bar);
Где Func
теперь является указателем на функцию, принимающую два аргумента при копировании (типов Foo
иBar
соответственно) и ничего не возвращать.
using
изначально имеет другое значение.Он предназначен для ввода имени в область видимости.Любое имя (почти) может быть введено: типы, функции, переменные (но не значения enum ...)
В C ++ 11 синтаксис был улучшен, чтобы разрешить псевдоним шаблона:
template <typename T>
using equiv_map = std::map<T,T>;
Это усиление using
означает, что псевдонимы (см. Ниже) теперь возможны в дополнение к предыдущим функциям.
Это изменение в C ++ 11 - четкое направление к синтаксисусогласование.Обратите внимание, что определение псевдонима теперь похоже на определение переменной:
<name> = <expression>;
К сожалению, стандарт, похоже, зарезервировал этот псевдоним для шаблонных ситуаций, поэтому на данный момент и typedef
, и using
сосуществуют, каждый со своим охотничьим угодьем.