“using”关键字能否完全替代“typedef”在所有情况下使用?

7

我知道使用using可以做到一些typedef无法做到的事情。

我只是想知道在所有情况下using是否可以完全替代typedef


@juanchopanza:例子? - Nawaz
2
@juanchopanza:如果那是例子,你误解了问题。问题是“using能否替换typedef?”而不是“typedef能否替换using?” - Nawaz
1
是的,在所有情况下,using 可以替换 typedef - Daniel Frey
@Nawaz,你是对的,我把它搞错了。对于造成的影响,很抱歉。 - juanchopanza
1个回答

7
是的,可以。引用自标准草案(重点是我的)。 7.1.3 typedef指定符[dcl.typedef]

2 typedef名称也可以通过别名声明来引入。使用关键字后面的标识符成为typedef名称,标识符后面的可选属性说明符序列与该typedef名称相关。它具有与typedef指定符相同的语义。


+1。但是,如果是这样,为什么委员会没有重载typedef的语义,而是重载using的语义呢? - xmllmx
@Angew 你说得对,撤回。无论如何,新关键字的动机应该在原始草案提案中找到。 - TemplateRex
4
可以在 n1489.pdf‎ 中找到这个理由:“然而,它也展示了几个缺点,其中之一是使用一个已知用于引入类型名称别名的关键字,在上下文中混淆,其中别名不表示类型,而是表示模板;Vec 不是类型别名,也不应该被视为 typedef 名称。Vec 是 std::vector<T,MyAllocator<T>> 家族的名称。 因此,我们不建议使用 typedef 语法。” - Jesse Good
@JesseGood 谢谢,那是正确的引用。模板别名添加了两个功能:模板泛化和从左到右。将任一功能添加到 typedef 中都会令人困惑。 - TemplateRex
1
你的初始陈述可能是正确的,但你的引用并不能证明它。 - Johannes Schaub - litb
@JohannesSchaub-litb 严格来说,你可能是对的,但我认为这句话提供了一个“算法”式的翻译。你能给出一个反例吗? - TemplateRex

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接