随着时间的推移,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++库应该为特征的公开方式提供一个通用接口。