该标准不对任何与早期实现一起使用的东西做出任何保证。规范定义了对实现的要求,而一个实现要么符合这些要求,要么不符合这些要求。将 C++11 实现的部分与早期实现的部分拼接在一起是不可移植的,而且实际上不太可能。
即使编写一个根本不使用标准库且不使用任何 C++11 功能的程序也可能与 C++03 实现的二进制文件不兼容。例如,实现者可能会利用新版本来更改调用约定。因此,通常将程序限制为auto
和 range-for 之类的功能不一定与 ABI 兼容。
我如何知道 c++11 的哪些部分是 libstdc++.so 的一部分,以及实际编译到二进制文件中的是什么?
即使您不使用标准库的任何部分(您可以通过简单地不使用任何头文件来保证这一点),这也不能保证编译后的二进制文件不需要 C++11 实现提供的运行时支持。一些可能依赖于运行时支持的语言特性示例是异常和虚拟成员。
同样,运行时库支持并不是 C++03 和 C++11 之间唯一可能导致 ABI 不兼容的东西。
c++11 是否会破坏旧库的 ABI 合规性?
不,我认为规范不需要任何阻止 C++03 和 C++11 实现共享 ABI 的东西。但是,您想知道的是,旧规范是否足够严格,以至于旧实现必须具有可能由 C++11 实现共享的 ABI?答案也没有,因此实现者在实现 C++11 时可能被迫破坏 ABI 兼容性。
特定的 C++03 和 C++11 实现可能会共同保证将 C++11 编译的二进制文件与 C++03 运行时支持混合在一起,因此您可以利用它。但是,我不知道有任何这样的实现。
另一种选择是,与其尝试混合 C++11 和 C++03 实现,您的 C++11 实现可能能够创建自包含的二进制文件(或者大部分是自包含的,因为至少它必须依赖不需要外部运行时支持的操作系统的系统调用 ABI)。
您可以依赖的兼容性是源代码级别。您可以编写也编译为 C++03 的 C++11 程序,以及也编译为 C++11 的 C++03 程序,当然,使用这种方法,您仅限于 C++ 之间的最低公分母03 和 C++11 以及您可以从中受益的唯一 C++11 特性是移动语义。