首页 文章

C 11中'typedef'和'using'有什么区别?

提问于
浏览
722

我知道在C 11中我们现在可以使用 using 来写类型别名,比如 typedef

typedef int MyInt;

从我的理解来看,相当于:

using MyInt = int;

这种新语法来自于努力表达“ template typedef ”:

template< class T > using MyType = AnotherType< T, MyAllocatorType >;

但是,对于前两个非模板示例,标准中是否还有其他细微差别?例如, typedef 以"weak"方式执行别名 . 也就是说,它不会创建新类型,只会创建一个新名称(这些名称之间隐含了转换) .

using 相同还是生成新类型?有什么不同吗?

4 回答

  • 147

    它们与标准(强调我的)(7.1.3.2)相同:

    也可以通过别名声明引入typedef-name . using关键字后面的标识符变为typedef-name,并且该标识符后面的可选attribute-specifier-seq属于该typedef-name . 它具有与typedef说明符引入的语义相同的语义 . 特别是,它没有定义新类型,它不应出现在type-id中 .

  • 13

    在模板中使用时, using 语法具有优势 . 如果需要类型抽象,还需要保留模板参数以便将来可以指定 . 你应该写这样的东西 .

    template <typename T> struct whatever {};
    
    template <typename T> struct rebind
    {
      typedef whatever<T> type; // to make it possible to substitue the whatever in future.
    };
    
    rebind<int>::type variable;
    
    template <typename U> struct bar { typename rebind<U>::type _var_member; }
    

    但是 using 语法简化了这个用例 .

    template <typename T> using my_type = whatever<T>;
    
    my_type<int> variable;
    template <typename U> struct baz { my_type<U> _var_member; }
    
  • 162

    它们基本相同,除了:

    别名声明与模板兼容,而C样式typedef则不兼容 .

  • 472

    它们本质上是相同的,但 using 提供了 alias templates ,这非常有用 . 我能找到一个很好的例子如下:

    namespace std {
     template<typename T> using add_const_t = typename add_const<T>::type;
    }
    

    所以,我们可以使用 std::add_const_t<T> 而不是 typename std::add_const<T>::type

相关问题