随着时间的推移,出现了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 ++标准库。
答案 0 :(得分:19)
您无法在任何版本的C ++中编写完全可移植的标准C ++库实现!首先,一些标准的C ++库组件清楚地抽象出系统细节。例如,文件流抽象了对文件访问的访问。是的,您可以使用FILE*
,但我认为标准C库是标准C ++库的一部分,便携式实现也需要包含该部分。而且,某些类型实际上取决于编译器,例如,因为存在与它们的语言级交互。例如std::bad_cast
导致dynamic_cast<...>()
被抛出。此外,一些标准的C ++库组件需要利用有关内存布局的已知信息,reinterpret_cast<...>()
做正确的事情。在其他情况下,标准库指定无法确定可移植的值,例如std::numeric_limits<T>
的某些字段。
标准C ++库的总体思想是它涵盖了常见需求并实现了某些无法实现可移植和高效实现的功能。您引用的类型特征只是编译器需要提供一些帮助的一些示例。虽然我试图就编译器如何暴露类型特征达成一致,但编译器编写者坚持认为他们需要自由选择,标准C ++库应该只提供一个公共接口来表示特征的暴露方式