您是正确的,在任何公共C ++ API中最好避免任何STL(实际上,任何来自模板库的第三方库中的任何东西)。您还希望遵循http://www.ros.org/reps/rep-0009.html#definition上的一长串规则,以禁止ABI破坏,这使得对公共C ++ API进行编程变得很繁琐。
关于C ++ 11的答案是否定的,这个标准并没有解决这个问题。更有趣的是为什么不呢?答案是因为C ++ 17非常令人触动,要实现C ++模块,我们需要导出的模板才能工作,为此,我们需要LLVM类型的编译器(例如clang),可以将完整的AST转储到光盘,然后在任何大型C ++项目中都进行与调用者相关的查找,以处理许多违反ODR的情况-顺便说一句,它包含许多GCC和ELF代码。
最后,我看到了许多MSVC仇恨和亲GCC评论。这些都是错误的信息-ELF上的GCC从根本上来说是无法恢复的,无法生成有效且正确的C ++代码。造成这种情况的原因很多,但我将快速举一个例子:ELF上的GCC无法安全地生成使用Boost.Python编写的Python扩展,其中多个基于Boost.Python的扩展已加载到Python中。这是因为ELF带有全局C符号表的设计完全无法通过设计来防止ODR违反导致段错误,而PE和MachO以及实际上提出的C ++模块规范都使用了每个模块的符号表-顺便说一句,这也意味着极大的进程初始化时间。还有很多其他问题:请参阅我最近在回答的StackOverflow例如,https: //stackoverflow.com/questions/14268736/symbol-visibility-exceptions-runtime-error/14364055#14364055在ELF上从根本上无法修复C ++异常引发。
最后一点:关于互操作不同的STL,这对于许多试图将紧密集成到某些STL实现中的第三方库混合在一起的大型企业用户来说是一个很大的痛苦。唯一的解决方案是C ++处理STL互操作的新机制,当您使用STL互操作时,您也可能会修复编译器互操作,因此您可以(例如)混合使用MSVC,GCC和clang编译的目标文件,并且所有这些都可以正常工作。我会观察C ++ 17的成果,然后看看接下来几年会发生什么-如果什么都做不到,我会感到惊讶。