Каковы различия между 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
, каждый со своей собственной землей.