我知道,在 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 则不兼容。