Каковы различия между typedef и использованием?

В чем разница между использованием

typedef Some::Nested::Namespace::TypeName TypeName;

или

using Some::Nested::Namespace::TypeName;

чтобы предоставить сокращение TypeName в локальной области?

Ответы

Ответ 1

typedef дает имя псевдонима для этого типа.

typedef Some:: Nested:: Namespace:: TypeName TypeName;

Как только вы это сделаете, вы можете ссылаться Some::Nested::Namespace::TypeName, просто говоря TypeName в локальном пространстве имен.


using declaration делает вид видимым в текущем пространстве имен.

используя Some:: Nested:: Namespace:: TypeName;

Импортирует тип в текущее пространство имен.

В этом случае, используя любой из приведенных выше, вы можете ссылаться на Some::Nested::Namespace::TypeName, просто используя TypeName в локальном пространстве имен.

Ответ 2

Использование только приносит объявление в локальную область, в то время как typedef вводит имя typedef. Одна разница между ними - это уточненные спецификаторы типа, например:


namespace n
{
  class foo
  {
  };
}

typedef n::foo n_foo;

using n::foo;

int main()
{
  class foo f1; // ok, declares f1 variable of type n::foo.
  class n_foo f2; // error, typedef-name can't be used in elaborated-type-specifier.
}

Ответ 3

Они имеют различное происхождение и разные виды использования.


typedef исходит из C: напомним, что способ C для объявления структуры:

typedef struct _MyStruct { .... } MyStruct;

Это позволяет вам вводить псевдоним только для типа. Он может использоваться для типа функции с неудобным синтаксисом...

typedef void (*Func)(Foo, Bar);

Где Func теперь является указателем на функцию, принимающую два аргумента путем копирования (типов Foo и Bar соответственно) и ничего не возвращающего.


using имеет, первоначально, другое значение. Он предназначен для ввода имени в область. Любое имя (почти) может быть введено: типы, функции, переменные (но не значения перечисления...)

С С++ 11 синтаксис был расширен, чтобы разрешить сглаживание шаблона:

template <typename T>
using equiv_map = std::map<T,T>;

Этот включенный using означает, что теперь возможно использование псевдонимов (см. ниже) в дополнение к предыдущим функциям.


Это изменение С++ 11 - это четкое направление к гармонизации синтаксиса. Обратите внимание, как определение псевдонима теперь похоже на определение переменной:

<name> = <expression>;

К сожалению, похоже, что Стандарт зарезервировал это псевдонимы для шаблонных ситуаций, так что на данный момент сосуществуют как typedef, так и using, каждый со своей собственной землей.