C++ 11库特性依赖于编译器特定的代理

gra*_*ter 12 c++ compiler-construction initializer-list c++-standard-library c++11

通过反复试验引起我的注意,有一些依赖于某种编译器魔术(TM)的certian C++ 11特性.我一直在搞乱实现我自己的标准符合标准的stdlib.我知道有很多可用的stdlib实现,但是这个更适合我个人版本的小应用程序.

昨晚我std::initializer_list根据规范实现了,我无法使其工作,我搜索高低的通道只留下声明它是不可能的,并且它需要修改编译器本身.好吧,我决定看看libstdc++它的当前实现,果然我的实现在设计上完全一样,边缘略有不同,我浪费了无数个小时搞清楚为什么实现不起作用,什么时候确切与设计相同的设计libstdc++.直到我意识到它必须在命名空间std之前六个小时.事实证明,实现是merley编译器的代理,这使得initializer_list可能,并且编译器本身搜索initializer_list该类namespace std.

我的问题是,我是否应该知道其他库函数需要某种特殊的编译器魔术才能工作,任何更隐藏的代理连接,或者为任何新的C++ 11库特性分离编译器内置?我想提前知道这些,所以当我实现依赖于编译器魔法的其他功能时,我可以做好准备,而不是浪费一整天通过反复试验来解决它; 这可能会变得单调乏味而且很烦人.

谢谢.

Pot*_*ter 11

函数<exception>主要是编译器的钩子.

<type_traits>没有编译器帮助,几个属性查询是不可能或很难实现的.即使是那些仅仅是困难的也可能因编译器的本机stdlib因"作弊"而成功而出现故障.当然,他们也会更快地编译.

虽然它可能写出<iostream>这样cin和cout被第一次使用时自动初始化,大多数编译器选择欺骗和链接它们,这样它们首先在静态初始化.

<typeinfo>当然,必须与编译器期望的完全匹配.

可能还有更多我不知道或无法想到的事情.

除了stdlib"作弊"并依赖于编译器之外,编译器还可能依赖于stdlib中存在的非标准函数.因此,即使您实现了所有标准功能,您也可能需要为遍历异常表复制粘贴例程,处理虚拟析构函数中的层次结构等.


Nic*_*las 5

所有"魔术"类型,编译器所需的类型,都列在他们自己的C++规范中称为"语言支持库"的特殊部分.显然,如果你正在实现C++标准库,你应该有一个标准方便的副本.初始化列表是在这一节中,以及type_info,<cstdint>中,全球运营商新/删除<exception>,等等.

不要试图实现这些; 使用编译器给你的东西.