C++11 与现有 libraries/frameworks 的兼容性

C++11 compatibility with existing libraries/frameworks

我想知道一些我尚未找到令人信服的答案。

情况:

std::string 和 std::vector 都支持移动语义,这很可能意味着它们与非 C++11 变体不二进制兼容。然而,应用程序和库都是使用相同的编译器和标准库构建的,所以如果库能够识别并支持它就不会那么奇怪了。

上述情况是否安全,或者是否真的需要使用 C++11 标志编译所有内容,即使使用相同的构建环境?

您可以认为不同编译器对 C++ 的每个翻译(即使编译器相同,但具有不同的(次要)版本)也是不兼容的。 C++ 没有通用的应用程序二进制接口 (ABI)。

此外,编译器支持的方言的变化就是ABI的变化,因此生成的库不兼容。一个明显的例子是发布构建与调试构建,其中调试数据结构引入了额外的成员。

移动结构 (C++11) 或不移动结构 (< C++11) 是 ABI 的根本变化。

This 页面专用于 c++11 到 4.7 版的 g++ abi 中断。 第一句有:

The C++98 language is ABI-compatible with the C++11 language, but several places in the library break compatibility. This makes it dangerous to link C++98 objects with C++11 objects.

虽然有一些示例,其中启用 c++11 不会破坏 ABI 兼容性:一个示例是 Qt,您可以在其中自由混合启用 c++11 的构建与 c++03 构建。