为什么C++中的类型别名使用'using'而不是'typedef'在语法上呢?

17 浏览
0 Comments

为什么C++中的类型别名使用'using'而不是'typedef'在语法上呢?

显然,类型别名和模板类型别名在语义上等同于typedef,它是typedef的扩展,支持模板。为什么不使用typedef来支持第一种情况,而使用使用using关键字的新语法来支持这些扩展呢?

注意:这不是\"using和typedef之间的区别\"问题的克隆。我知道using优势在于定义一族typedef。我想问的是,为什么标准人员决定使用using关键字来扩展这个而不是typedef关键字。这似乎只会在语言中增加混淆。

admin 更改状态以发布 2023年5月23日
0
0 Comments

实际上,您建议的回归方法已在Herb Sutter的2002年文件N1406中提出过。例如,它允许编写:

template typedef X Xi; 

这在Gabriel Dos Reis和Mat Marcus的N1449中稍作修改。他们采用了using的语法,并指出以下内容:

请注意,我们明确避免使用“typedef template”这个术语,并引入了涉及“using”和“=”的新语法,以帮助避免混淆:我们在这里没有定义任何类型,我们正在引入类型(即别名)的抽象,该类型涉及模板参数的类型ID(即类型表达式)。

他们还说:

关于语法,进行了两次草率的调查。强大的大多数人投票避免typedef template语法,而支持“=”语法。第二次投票表明,与像“alias”这样的单词或完全没有关键字相比,强烈偏好“using”关键字。使用任何关键字的动机部分源于希望使用语法,该语法可能与简要概述的非模板别名方向兼容。

然后,Gabriel Dos Reis和Bjarne Stroustrup在最终提案N2258中采用了这种语法。

0
0 Comments

以下是Bjarne Stroustrup关于为什么使用using而不是延伸typedef的说法:

关键字using用于获得线性符号“名称后跟引用内容”的符号。我们尝试了传统而复杂的typedef解决方案,但从未成功地获得完整和一致的解决方案,直到我们决定采用不太模糊的语法。

他还声称,他也喜欢这种语法用于通常的typedef

除了在与模板有关时很重要外,类型别名也可以用作集中不同(并且在我的看法中更好)的语法,用于普通的类型别名:

using PF = void (*)(double);

他在这里非常正确,这看起来很干净。相比之下,typedef的名称将非常复杂,名称将出现在中间:

typedef void(*PF)(double);

下面是他们的建议的解释(见第4页):

建议(重新)使用关键字typedef——像在文献[4]中一样——引入模板别名:

template
typedef std::vector> Vec;

这种符号的优点是使用关键字已知,即引入类型别名。但是,它也显示出几个缺点,包括使用已知关键字在上下文中引入类型名称的别名时可能会引起混乱,但别名并不指定类型,而是指定模板;Vec不是类型的别名,并且不应该被视为typedef名称。名称Vec是家族的名称std::vector<*, MyAllocator<*>>——其中的星号是类型名称的占位符。
因此,我们不提出“typedef”语法。

template
using Vec = std::vector>;

可以这样阅读/解释:Vec < T >现在将用作std::vector < T, MyAllocator < T >>的同义词。从那时起,新别名的语法似乎是合理的。

所以他基本上有两个观点:

  1. using模板将成为类型家族,而不是类型,因此typedef是“错误”的
  2. using几乎可以被看作是一种英语句子
0