为什么C++中的类型别名使用'using'而不是'typedef'在语法上呢?
为什么C++中的类型别名使用'using'而不是'typedef'在语法上呢?
显然,类型别名和模板类型别名在语义上等同于typedef,它是typedef的扩展,支持模板。为什么不使用typedef来支持第一种情况,而使用使用using
关键字的新语法来支持这些扩展呢?
注意:这不是\"using和typedef之间的区别\"问题的克隆。我知道using
优势在于定义一族typedef
。我想问的是,为什么标准人员决定使用using
关键字来扩展这个而不是typedef
关键字。这似乎只会在语言中增加混淆。
实际上,您建议的回归方法已在Herb Sutter的2002年文件N1406中提出过。例如,它允许编写:
templatetypedef X Xi;
这在Gabriel Dos Reis和Mat Marcus的N1449中稍作修改。他们采用了using
的语法,并指出以下内容:
请注意,我们明确避免使用“typedef template”这个术语,并引入了涉及“using”和“=”的新语法,以帮助避免混淆:我们在这里没有定义任何类型,我们正在引入类型(即别名)的抽象,该类型涉及模板参数的类型ID(即类型表达式)。
他们还说:
关于语法,进行了两次草率的调查。强大的大多数人投票避免typedef template语法,而支持“=”语法。第二次投票表明,与像“alias”这样的单词或完全没有关键字相比,强烈偏好“using”关键字。使用任何关键字的动机部分源于希望使用语法,该语法可能与简要概述的非模板别名方向兼容。
然后,Gabriel Dos Reis和Bjarne Stroustrup在最终提案N2258中采用了这种语法。
以下是Bjarne Stroustrup关于为什么使用using
而不是延伸typedef
的说法:
关键字
using
用于获得线性符号“名称后跟引用内容”的符号。我们尝试了传统而复杂的typedef
解决方案,但从未成功地获得完整和一致的解决方案,直到我们决定采用不太模糊的语法。
他还声称,他也喜欢这种语法用于通常的typedef
:
除了在与模板有关时很重要外,类型别名也可以用作集中不同(并且在我的看法中更好)的语法,用于普通的类型别名:
using PF = void (*)(double);
他在这里非常正确,这看起来很干净。相比之下,typedef
的名称将非常复杂,名称将出现在中间:
typedef void(*PF)(double);
下面是他们的建议的解释(见第4页):
建议(重新)使用关键字
typedef
——像在文献[4]中一样——引入模板别名:templatetypedef std::vector > Vec;
这种符号的优点是使用关键字已知,即引入类型别名。但是,它也显示出几个缺点,包括使用已知关键字在上下文中引入类型名称的别名时可能会引起混乱,但别名并不指定类型,而是指定模板;
Vec
不是类型的别名,并且不应该被视为typedef
名称。名称Vec
是家族的名称std::vector<*, MyAllocator<*>>
——其中的星号是类型名称的占位符。
因此,我们不提出“typedef
”语法。templateusing Vec = std::vector >;
可以这样阅读/解释:
Vec < T >
现在将用作std::vector < T, MyAllocator < T >>
的同义词。从那时起,新别名的语法似乎是合理的。
所以他基本上有两个观点:
using
模板将成为类型家族,而不是类型,因此typedef
是“错误”的using
几乎可以被看作是一种英语句子