typedef和using之间有什么区别?

时间:2011-10-05 06:56:16

标签: c++ typedef using

使用

之间有什么区别
typedef Some::Nested::Namespace::TypeName TypeName;

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

在本地范围内提供简写TypeName

3 个答案:

答案 0 :(得分:6)

typedef为该类型提供别名。

  

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

完成此操作后,您只需在本地命名空间中说Some::Nested::Namespace::TypeName即可引用TypeName


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

  

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

在当前命名空间中导入类型。

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

答案 1 :(得分: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.
}

答案 2 :(得分:6)

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


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

typedef struct _MyStruct { .... } MyStruct;

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

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

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


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

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

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

此加电using表示现在可以使用别名(见下文),除了之前的功能之外。


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

<name> = <expression>;

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