typedef和using之间有什么区别?

pal*_*m3D 15 c++ typedef using

使用之间有什么区别

typedef Some::Nested::Namespace::TypeName TypeName;
Run Code Online (Sandbox Code Playgroud)

要么

using Some::Nested::Namespace::TypeName;
Run Code Online (Sandbox Code Playgroud)

提供TypeName当地范围的速记?

Alo*_*ave 6

typedef 给出类型的别名.

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

完成后,您Some::Nested::Namespace::TypeName只需TypeName在本地命名空间中说出即可.


using declaration 使类型在当前命名空间中可见.

使用Some :: Nested :: Namespace :: TypeName;

在当前名称空间中导入类型.

在这种情况下,使用上述任一方法,您Some::Nested::Namespace::TypeName只需TypeName在本地命名空间中使用即可引用.

  • 虽然有真正的区别吗?特别是根据提升的C++ 11`使用'语句,它允许定义模板化别名. (2认同)

Kon*_*hin 6

使用只是将声明带入本地范围,而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.
}


Mat*_* M. 6

它们有不同的起源和不同的用途.


typedef来自C:回想一下,声明结构的C语言是:

typedef struct _MyStruct { .... } MyStruct;
Run Code Online (Sandbox Code Playgroud)

它允许您仅为类型引入别名.它可以用于函数的类型,具有笨拙的语法......

typedef void (*Func)(Foo, Bar);
Run Code Online (Sandbox Code Playgroud)

Func现在在哪里指向一个函数的指针,该函数通过副本(分别为类型FooBar)返回两个参数并且不返回任何内容.


using最初有一个不同的含义.它意味着在范围中注入名称.可以注入任何名称(几乎):类型,函数,变量(但不是枚举值......)

使用C++ 11,语法已得到增强,允许模板别名:

template <typename T>
using equiv_map = std::map<T,T>;
Run Code Online (Sandbox Code Playgroud)

这种加电using意味着现在可以在之前的功能之上进行混叠(见下文).


这种C++ 11的改变是语法协调的明确方向.请注意别名的定义现在与变量的定义类似:

<name> = <expression>;
Run Code Online (Sandbox Code Playgroud)

不幸的是,似乎标准保留了这个别名到模板的情况,所以现在都typedefusing共存,每个都有自己的狩猎场.