【问题标题】:What are the differences between typedef and using?typedef 和 using 有什么区别?
【发布时间】:2011-12-01 05:52:09
【问题描述】:

使用有什么区别

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

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

在本地范围内提供简写TypeName

【问题讨论】:

    标签: c++ typedef using


    【解决方案1】:

    typedef 为该类型提供别名。

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

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


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

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

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

    在这种情况下,使用上述任一方法,您都可以通过在本地命名空间中使用 TypeName 来引用 Some::Nested::Namespace::TypeName

    【讨论】:

    • 有真正的区别吗?特别是考虑到允许定义模板化别名的增强型 C++11 using 语句。
    • 模板类型至少有一处区别。你只能typedef一个专门的类型,比如vector<int>,你可以只在非专门的模板上使用using(例如vector
    • 如果你有一堆重载的运算符要导入,typedef 在这种情况下不起作用,因为你必须使用using
    • @AraK: typedef 只适用于别名 types(顾名思义),所以当然不能导入其他任何东西。
    【解决方案2】:

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

    【讨论】:

      【解决方案3】:

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


      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 共存,每个都有自己的猎场。

      【讨论】:

      • 你的最后一段是说using name = int; 在 C++11 中的格式不正确吗?
      • @DyP:这就是我的意思,虽然我不记得为什么,因为它确实有效(并且对于函数引用/指针非常方便)。我想知道我是否被早期版本的 gcc/clang 烫伤了。
      猜你喜欢
      • 1970-01-01
      • 2013-09-18
      • 2012-05-31
      • 1970-01-01
      • 2016-06-14
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多