当前位置: 首页 > 知识库问答 >
问题:

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

孟修竹
2023-03-14

显然,类型别名和模板化类型别名在语义上等同于typedefs和typedefs的扩展,以支持模板。为什么使用using关键字为这些创建了新语法,而不是在第一个关键字中使用typedefs,以及一些使用typedef的语法扩展。

注意:这不是“using和typedef之间的区别”问题的克隆。我知道使用提供了定义typedef族的优势。我想问的是为什么标准人员决定让这个扩展使用using关键字而不是typedef关键字。这似乎只是增加了语言的混乱。

共有1个答案

太叔豪
2023-03-14

下面是Bjarne Stroustrup关于为什么他们使用而不是扩展typedef引入的说法:

关键字using用于获得线性表示法“name后跟它所引用的内容”。我们尝试了传统的、复杂的typedef解决方案,但从未得到一个完整的、连贯的解决方案,直到我们确定了一个不那么晦涩的语法。

他还声称,对于通常的typedefs,他也更喜欢这种语法:

using PF = void (*)(double);
typedef void(*PF)(double);

有人建议使用关键字typedef来引入模板别名,就像在论文[4]中所做的那样:

template<class T>
typedef std::vector<T,MyAllocator<T>> Vec;

这种表示法的优点是使用已知的关键字引入类型别名。然而,它也显示了一些缺点,其中包括在别名不是指定类型而是模板的上下文中使用已知的关键字为类型名引入别名的混乱;vec不是类型的别名,不应用作typedef-name。名称vec是族std::vector<*,myallocator<*>>的名称,其中星号是类型名的占位符。因此,我们不提出“typedef”语法。

template<class T>
using Vec = std::vector<T,MyAllocator<T>>;

可以读/解释为:从现在开始,我将使用vec 作为std::vector > 的同义词。读到这一点,新的别名语法似乎合乎逻辑。

    null

 类似资料:
  • 我正在阅读有关C++11新特性的维基百科页面,但不理解有关类型别名的这一部分:https://en.wikipedia.org/wiki/c%2b%2b11#template_aliases using语法也可以用作C++11中的类型别名: typedef void(*FunctionType)(double);//旧样式 使用FunctionType=void(*)(double);//新引入的

  • 在阅读参考资料时。com文档中的std::numeric_limits,我遇到了以下声明: 还提供了所有整数类类型的专门化。(从20世纪开始) 我的问题是,我们在上面的语句中所说的整数类类型是什么意思。我的意思是,我知道是C中的内置类型。我们可以在C中提供用户定义的类。但是我从来没有读过关于整数类类型的文章。我试着在谷歌上搜索这个短语,但是没有找到任何与此相关的东西。

  • 问题内容: 我对一方面用于协议的关联类型的语法和另一方面用于泛型类型的语法之间的区别感到困惑。 例如,在Swift中,可以使用以下方式定义通用类型 而使用诸如 为什么后者不只是: 是否有某种深层的原因(或者也许是显而易见的,对我来说就迷失了),原因是该语言未采用后一种语法? 问题答案: 在开发人员列表中已对此进行了多次讨论。基本答案是关联类型比类型参数更灵活。虽然您在这里有一个类型参数的特定情况,

  • 问题内容: Go中的类型定义为 的别名,在所有方面都等效。按照惯例,它用于区分字符值和整数值。 如果打算使用这种类型来表示字符值,为什么Go语言的作者不使用而不是?当值是负数时,他们如何期望在程序中处理该值?另一个类似的类型是(而不是)的别名,这似乎是合理的。 问题答案: 我用Google搜索并找到了这个 这已经被问过好几次了。符文占用4个字节,而不仅仅是一个字节,因为它应该存储unicode码点

  • 问题内容: 我试图将某些类别方法导入我的Swift文件,但没有任何运气。 ios-Bridging-Header.h: UIColor + Hex.h 我希望自动完成功能能够揭示并 问题答案: 实际上,您的类别将转换为Swift,如下所示: 因此,您应该使用: 不过,自动完成功能在Beta版软件中可能仍然存在问题。

  • 当我今天阅读C标准时,它提到了副作用 访问易失性对象、修改对象、修改文件或调用执行任何这些操作的函数都是副作用 C标准说 访问易失性glvalue(3.10)指定的对象、修改对象、调用库I/O函数或调用执行任何这些操作的函数都是副作用 因此,因为两者都禁止在同一个标量对象上发生未排序的副作用,所以C允许以下内容,但C使其成为未定义的行为 我是否正确阅读了规格?如果存在差异,原因是什么?