协慌网

登录 贡献 社区

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

我知道,在 C ++ 11,我们现在可以使用using写类型别名,像typedef S:

typedef int MyInt;

从我的理解,相当于:

using MyInt = int;

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

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

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

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

答案

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

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

在模板中使用时, 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; }

但是使用语法简化了这个用例。

template <typename T> using my_type = whatever<T>;

my_type<int> variable;
template <typename U> struct baz { my_type<U> _var_member; }

它们大致相同,除了:

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