C++标准库是否是C++语言的一部分?(注意“语言”而不是“标准”,当然两者都是标准的一部分)。
如果是的话,为什么?如果不是,为什么不是?
对于这个问题的答案可能因C++98、C++03和C++0x而异。
由于相关标准文件中的措辞/要求可以推断出答案,因此这不是主观的。
C++标准库是否是C++语言的一部分?(注意“语言”而不是“标准”,当然两者都是标准的一部分)。
如果是的话,为什么?如果不是,为什么不是?
对于这个问题的答案可能因C++98、C++03和C++0x而异。
由于相关标准文件中的措辞/要求可以推断出答案,因此这不是主观的。
是的,在当前标准(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++,而标准要求同时包含语言本身和库。
至少它们不是分开的!
在标准的多个地方,语言条款使用了库条款中定义的类型和接口。如果它们是分开的实体,那么该怎样做呢?
例如,下面这个结构:
std::vector<int> v = {1, 2, 3, 4, 5};
使用库中的std :: initializer_list。
新表达式
char* p = new char[42];
使用 <new> 中的 operator new。
operator typeid
返回 std::type_info,是一个库类型。
核心特性 dynamic_cast 可能会抛出在库中定义的异常。
一些库的部分,例如 type_traits 和 atomic,不能仅作为库来实现,因此它们肯定不是独立的。
第2到16条描述了C ++编程语言。该描述包括以1.6中描述的形式的详细语法规范。为方便起见,附录A重复了所有这些语法规范。 第18到30条和附录D(库条款)描述了标准C ++库。该描述包括以第17条中描述的形式的模板、类、函数、常量和宏的详细描述。
[/编辑]ranged-for
时)。 - Lightness Races in Orbitrange-for
不再需要库了。如果找到了begin()
和end()
,它就会使用它们,否则就会退回到ADL。这意味着我们可以定义全局的begin()
和全局的end()
,并且在没有stdlib的自由实现中使range-for
工作。但我不太确定这对于这个讨论的影响是什么。 - Lightness Races in Orbit