Каковы различия между typedef и использованием? - PullRequest
15 голосов
/ 05 октября 2011

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

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

или

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

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

Ответы [ 3 ]

6 голосов
/ 05 октября 2011

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


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

6 голосов
/ 05 октября 2011

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


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 сосуществуют, каждый со своим охотничьим угодьем.

6 голосов
/ 05 октября 2011

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

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

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


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

с использованием Some :: Nested :: Namespace :: TypeName;

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

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

...