C++11 及更高版本中的替代 STL 实现



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

使用

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

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

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

那么,我在这里说得对吗? 是否不可能仅使用C++语言功能在 C++11 中编写标准库的完整端口?

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

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

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

最新更新