通过反复试验,我注意到某些 C++11 特性依赖于某种编译器魔法 (TM)。我一直在忙于实现我自己的符合标准的 stdlib。我知道 stdlib 有现成的实现,但这个更像是我自己的小型应用程序个人版本。
昨晚我根据规范实现了 std::initializer_list
,但我在使它工作时遇到了麻烦,我四处寻找答案,结果只留下了不可能的陈述,并且需要对编译器本身进行修改。好吧,我决定看看它当前的 0x25181231343141 实现,果然我的实现在设计上完全相同,只是边缘略有不同,我浪费了毫无意义的时间来弄清楚为什么实现不起作用,当它与 libstdc++
中的设计完全相同。直到六个小时后我才意识到它必须在命名空间 std 中。事实证明,实现是编译器的 merley 代理,这使得 libstdc++
成为可能,并且编译器本身在 initializer_list
中搜索 initializer_list
类。
我的问题是是否还有其他我应该知道的库功能需要某种特殊的编译器魔法才能工作,任何更多隐藏的代理连接,或者为任何新的 C++11 库功能 secret 编译器内部特性?
我想提前知道这些,这样我就可以为实现其他依赖于编译器魔法的功能做好准备,而不是浪费一整天的时间来反复试验;这可能会变得乏味和烦人。
谢谢。
最佳答案
<exception>
中的函数大多是编译器的钩子(Hook)。
如果没有编译器的帮助,几个 <type_traits>
属性查询是不可能或很难实现的。即使只是困难的那些也可能由于“作弊”而在编译器的 native stdlib 成功时出现故障。当然,它们也会编译得更快。
尽管可以编写 <iostream>
使得 cin
和 cout
在第一次使用时自动初始化,但大多数编译器选择欺骗和链接它们,使它们在静态初始化中首先出现。<typeinfo>
当然,必须与编译器期望的完全匹配。
可能还有更多我不知道或想不到的事情。
除了stdlib“作弊”和依赖编译器之外,编译器还可能依赖stdlib中存在的非标准函数。因此,即使您实现了所有标准功能,您也可能必须复制粘贴例程以遍历异常表、处理虚拟析构函数中的层次结构等。
关于C++11 库功能取决于编译器特定的代理,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/7381928/