C++标准库是否是C++语言的一部分?

10

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

如果是的话,为什么?如果不是,为什么不是?

对于这个问题的答案可能因C++98、C++03和C++0x而异。

由于相关标准文件中的措辞/要求可以推断出答案,因此这不是主观的。


4
这是一个恶作剧问题还是一项阅读理解测试? - Hans Passant
1
就在C++0x到来之前,这个问题被恰好提出了。 - Sadique
@Acme:完全正确。 :) 顺便感谢您添加的标签。 - Lightness Races in Orbit
2
@John:嗯,这确实是个问题。 - Lightness Races in Orbit
1
@JoeGauterin:我们中的一些人对使用的技术的精确细节感兴趣。如果你不感兴趣,那么你不必参与! - Lightness Races in Orbit
显示剩余5条评论
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++,而标准要求同时包含语言本身和库。


1
虽然我同意你的观点,但你能否用可靠的引用或理由证明“规范”与“语言”是同义词?而且,“语言”不仅仅指“规范的核心部分”吗? - Lightness Races in Orbit
引用在标准文档中。没有“两个”文档,一个是关于语言的,另一个是关于标准库的。只有“一个”,你要么符合规范,要么不符合,规范包含了语言本身和库。 - paxdiablo
@paxdiablo:C++0x的最新草案是n3242,我认为他们没有改变章节。 - Matthieu M.
我并没有说语言,我说的是“语言本身”,我的意思是指非库的东西。标准不使用这个术语。标准要求标准库是实现的一部分,任何不符合标准的都不是C++。 - paxdiablo
1
@Tomalak:是否有实际原因使得知道库是“语言的一部分”还是“与语言分开但在同一规范中定义”很重要?你的评论似乎暗示着有一个原因...我想知道是什么! - Martin B
显示剩余6条评论

6

至少它们不是分开的!

在标准的多个地方,语言条款使用了库条款中定义的类型和接口。如果它们是分开的实体,那么该怎样做呢?

例如,下面这个结构:

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,不能仅作为库来实现,因此它们肯定不是独立的。


6
我所看到的标准版本中的第一句话都是:“本国际标准规定了C++编程语言实现的要求。” 换句话说,标准中规定的任何内容都是“语言”的一部分。
在其他地方,标准确实区分了库和语言的其余部分。然而,从正式上讲,唯一的真正区别是库是基于语言的非库部分来定义的;也就是说,库定义了类和模板。标准还明确指出,库不需要以库的形式存在,可以作为头文件的形式存在,其中的一部分或所有内容可以内置到编译器中(尽管我不知道有哪个编译器实际这样做)。

2
是的 - 你可以在C++标准中找到指定的库。有时,你会遇到术语“核心语言特性”来区分它们与库特性,但它们都是语言的一部分。
[编辑] 实际上,标准本身似乎区分语言和库。从C++0x(1.5)的最新草案中:
引用:

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

[/编辑]

我知道这是标准规定,但我想找的是一些证明“标准规定”意味着“语言的一部分”的东西。标准包含“语言”和“库”,还是标准就是“语言”,其中包含“库”? - Lightness Races in Orbit
@Tomalak Geret'kal:实际上我可能是错的 - 请看我的更新答案。 - Nemanja Trifunovic
@Nemenja:看,这就是我试图通过这个问题表达的意思。 :) 有一个区别,但是库和语言是不可分割的(特别是在C++0x中,使用ranged-for时)。 - Lightness Races in Orbit
好的,显然range-for不再需要库了。如果找到了begin()end(),它就会使用它们,否则就会退回到ADL。这意味着我们可以定义全局的begin()和全局的end(),并且在没有stdlib的自由实现中使range-for工作。但我不太确定这对于这个讨论的影响是什么。 - Lightness Races in Orbit

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