13

随着时间的推移,出现了 STL* 的各种替代实现 - 例如 STLPort。某些大公司也出于各种目的使用自己的 STL 内部端口。

使用 C++03,可以仅使用可移植的 C++ 语言功能编写 STL 的端口,这意味着任何符合要求的编译器都应该能够编译它。

但是对于 C++11,是否有某些功能需要编译器支持?

例如,我看不出如何std::is_standard_layout仅使用 C++ 语言功能来实现。我认为std::is_base_of可以std::is_convertible使用基指针和派生指针来实现。但我无法想象如何std::is_standard_layout实施。可能还有其他我没有想到的功能。

那么,我在这里正确吗?使用C++ 语言功能就不可能在 C++11 中编写标准库的完整端口吗?

*我知道 STL 和“C++ 标准库”不能严格互换,但显然在这种情况下我指的是 C++ 标准库。

4

1 回答 1

19

您不能在任何版本的 C++ 中编写完全可移植的标准 C++ 库实现!首先,一些标准 C++ 库组件清楚地抽象了系统细节。例如,文件流抽象了对文件访问的访问。是的,您可以FILE*在后台使用,但我认为标准 C 库是标准 C++ 库的一部分,并且可移植实现也需要包含该部分。此外,某些类型实际上取决于编译器,例如,因为它们之间存在语言级别的交互。例如std::bad_cast,由于dynamic_cast<...>(). 此外,一些标准 C++ 库组件需要利用关于内存布局的知识,以及reinterpret_cast<...>()做正确的事。在其他情况下,标准库指定了无法确定可移植的值,例如std::numeric_limits<T>.

标准 C++ 库的总体思路是,它涵盖了常见需求并实现了某些无法以可移植和高效方式实现的功能。您引用的类型特征只是编译器需要提供一些帮助的一些示例。尽管我试图就编译器如何暴露类型特征达成一些共识,但编译器作者坚持认为他们需要自由选择,标准 C++ 库应该只为特征暴露的方式提供一个通用接口.

于 2013-09-20T18:28:40.630 回答