【问题标题】:Is the C++ Standard Library part of the C++ Language?C++ 标准库是 C++ 语言的一部分吗?
【发布时间】:2011-03-28 14:35:10
【问题描述】:

C++ 标准库 C++ 语言的一部分吗? (注意“语言”,而不是“标准”;当然,两者都是标准的一部分)。

如果是这样,为什么?如果没有,为什么不呢?

这个问题的答案可能在 C++98、C++03 和 C++0x 中有所不同。

这不是主观的,因为它可以从相关标准文档中的措辞/要求中推断出来。

【问题讨论】:

  • 这是一道题还是阅读理解题?
  • @HansPassant:在我看来,这是一个很好的社区 wiki 帖子。
  • 就在C++0x到来之前。这个问题是在正确的时间提出的。
  • @John:这就是问题所在,真的。
  • @JoeGauterin:我们中的一些人有兴趣了解我们使用的技术的精确细节。如果你不是,那么你不必参加!

标签: c++ c++11 language-lawyer


【解决方案1】:

是的,在当前标准 (C++03) 和即将推出的新标准 (C++0x,它终于进入了最终草案阶段,所以现在应该不会太长),库函数是规范的一部分(至少对于托管实现而言)。即使是独立的实现也需要一个标准库,尽管它要简单得多。

在 C++03 中,第 17 章到第 27 章处理标准库。在 C++0x 中(至少是我手头最新的 n3225 草案),第 17 章到第 30 章是相关的。

您可以查看 C++03 的标准和当前的 C++0x 草案来确认这一点。标准包含适当的语言和标准库。

来自 C++03(与本节的 C++0x 几乎相同):

1.1 范围 [intro.scope]

1 本国际标准规定了 C++ 编程语言的实现要求。第一个这样的要求是他们实现了语言,所以这个国际标准也定义了 C++。其他要求和对第一个要求的放宽出现在本国际标准的各个地方。

2 C++ 是一种基于 ISO/IEC 9899:1990 编程语言 – C (1.2) 中描述的 C 编程语言的通用编程语言。除了 C 提供的工具之外,C++ 还提供了额外的数据类型、类、模板、异常、命名空间、内联函数、运算符重载、函数名重载、引用、免费存储管理运算符和其他库工具。

因此您可以从中看出标准作者确实区分了语言本身和库,但是对于标准的实现者和语言的用户来说,语言是整体事物。除非您遵循标准,否则您不能称自己为 C++,并且该标准同时需要适当的语言和库。

【讨论】:

  • @paxdiablo:你的反应非常敏锐……打败我吧! :)
  • 虽然我同意你的观点,但你能否用坚定的引用/理由证明“规范”与“语言”是同义词?而且“语言”不仅仅意味着“规范的语言核心部分”?
  • 引用在标准文档中。没有两个文档,一个用于语言,一个用于标准库。只有一个,你要么符合规范,要么不符合规范,并且规范包含适当的语言和库。
  • @paxdiablo:C++0x 的最新草案是 n3242,不要以为他们改变了章节。
  • @Tomalak:是否有实际的理由让了解库是“语言的一部分”还是“与语言分离但在同一规范中定义”很重要?你的 cmets 似乎暗示有一个......我想知道它是什么!
【解决方案2】:

我见过的所有标准版本中的第一个词 是“本国际标准规定了要求 C++ 编程语言的实现。”换句话说, 标准中指定的任何内容都是“语言”的一部分。

在其他地方,标准确实区分了库和 语言的其余部分。然而,形式上唯一真正的区别 是图书馆是根据非图书馆部分定义的 语言;即库定义类和模板。标准 还清楚地表明图书馆不需要作为图书馆存在, 以头文件和部分的形式,或者全部都可以内置到 编译器(虽然我不知道有任何编译器实际上是 所以)。

【讨论】:

    【解决方案3】:

    至少它们不是分开的!

    在一些地方,标准的语言子句使用了库子句中定义的类型和接口。如果它们是独立的实体,它怎么能做到这一点?

    例如构造

    std::vector<int> v = {1, 2, 3, 4, 5};
    

    使用库中的 std::initializer_list。

    新的表达方式

    char* p = new char[42];
    

    使用来自 的运算符 new。

    运算符typeid 返回std::type_info,一个库类型。

    核心功能 dynamic_cast 可能会引发异常,在库中定义。

    库的某些部分,例如 type_traits 和 atomic 不能仅仅作为一个库来实现,所以它们绝对不是分开的。

    【讨论】:

      【解决方案4】:

      是的 - 您可以找到 C++ 标准中指定的库。有时,您会遇到术语“核心语言特性”来将它们与库特性区分开来,但它们都是语言的一部分。

      [编辑] 实际上,标准本身似乎对语言和库进行了区分。来自C++0x(1.5)的最新草案

      第 2 到 16 条描述了 C++ 编程语言。该描述包括详细的句法 规格在 1.6 中描述的形式。为方便起见,附录 A 重复了所有此类句法规范。 2 第 18 到 30 条和附录 D(库条款)描述了标准 C++ 库。那个描述 包括构成模板、类、函数、常量和宏的详细描述 库,采用第 17 条中描述的形式。

      [/编辑]

      【讨论】:

      • 我知道它在标准中,但我想我正在寻找的是证明/证明“在标准中”意味着“语言的一部分”的东西。标准是否包含“语言”和“库”,或者标准“语言”,恰好包含“库”?
      • @Tomalak Geret'kal:实际上我可能错了 - 请参阅我的更新答案。
      • @Nemenja:看到这就是我试图解决这个问题的原因。 :) 有区别,但是库和语言密不可分(尤其是在 C++0x 中,ranged-for)。
      • 好吧,显然range-for 不再需要该库。如果找到,它使用begin()end(),如果没有,则使用 ADL。这意味着我们可以定义全局begin() 和全局end() 并让range-for 在没有stdlib 的独立实现中工作。我不太确定这对 w.r.t 有什么影响。不过这个讨论。
      猜你喜欢
      • 1970-01-01
      • 2011-01-20
      • 2013-06-13
      • 2016-09-21
      • 1970-01-01
      • 1970-01-01
      • 2021-12-11
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多