我知道在 C++11 中我们现在可以使用 using
来编写类型别名,例如 typedef
s:
typedef int MyInt;
据我了解,相当于:
using MyInt = int;
新语法源于努力表达“模板类型定义”:
template< class T > using MyType = AnotherType< T, MyAllocatorType >;
但是,对于前两个非模板示例,标准中是否还有其他细微差别?例如, typedef
以“弱”方式进行别名。也就是说,它不会创建新类型,而只会创建一个新名称(这些名称之间的转换是隐含的)。
与 using
是否相同,还是会生成新类型?有什么不同吗?
原文由 Klaim 发布,翻译遵循 CC BY-SA 4.0 许可协议
以下所有标准参考均指 N4659:2017 年 3 月 Kona 后工作草案/C++17 DIS 。
Typedef 声明可以用作初始化语句,而别名声明不能(+)用作初始化语句
(+) P2360R0 ( Extend init-statement to allow alias-declaration ) 已被 CWG 批准, 从 C++23 开始,typedef 声明和别名声明之间的这种不一致将被删除。
(++) 除了 别名模板 的例子,在原帖中已经提到过。
相同的语义
由 [dcl.typedef]/2 [摘录, 强调 我的] 管理
由 别名声明 引入的 typedef-name 与由
typedef
声明引入的 语义相同。允许的上下文中的细微差别
然而,这 并不 意味着这两种变体对于它们可能被使用 的上下文 具有相同的限制。事实上,尽管是一个极端情况, typedef 声明 是一个 init 语句,因此可以在允许初始化语句的上下文中使用
而 别名声明 不是 init-statement ,因此 不能 在允许初始化语句的上下文中使用