10

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

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

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

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

4

4 回答 4

13

是的,在当前标准 (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++。

于 2011-03-28T14:37:41.193 回答
6

至少他们不是分开的!

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

例如构造

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

使用库中的 std::initializer_list 。

新的表达

char* p = new char[42];

使用来自 <new> 的运算符 new。

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

核心功能 dynamic_cast 可能会抛出库中定义的异常。

库的某些部分,如 type_traits 和 atomic 不能仅作为库实现,因此它们绝对不是分开的。

于 2011-03-28T16:37:41.840 回答
6

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

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

于 2011-03-28T17:00:13.480 回答
2

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

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

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

[/编辑]

于 2011-03-28T14:42:21.157 回答