在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名称也可以通过别名声明引入。 using关键字后面的标识符变为typedef-name,标识符后面的可选attribute-specifier-seq属于该typedef-name。 它具有与typedef说明符所引入的相同的语义。 特别是它没有定义一个新的类型,它不会出现在type-id中。
使用语法在模板中使用时具有优势。 如果您需要类型抽象,但还需要保留模板参数以便将来可以指定。 你应该写这样的东西。
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; }
除此之外,它们在很大程度上是相同的
The alias declaration is compatible with templates, whereas the C style typedef is not.
上一篇: What is the difference between 'typedef' and 'using' in C++11?