我想知道一些我尚未找到令人信服的答案的事。
情况:
std :: string和std :: vector都支持移动语义,这很可能意味着它们与非C ++ 11变体不是二进制兼容的。但是应用程序和库都使用相同的编译器和标准库构建,因此如果lib能够识别并支持它,那就不会那么奇怪了。
上述情况是否安全,或者是否真的需要使用C ++ 11标志编译所有内容,即使使用相同的构建环境?
答案 0 :(得分:5)
This页面致力于g ++ abi打破c ++ 11到4.7版本。 第一句话是:
C ++ 98语言与C ++ 11语言ABI兼容,但库中的几个地方破坏了兼容性。这使得将C ++ 98对象与C ++ 11对象链接起来很危险。
虽然有一些例子,但启用c ++ 11不会影响ABI兼容性:一个例子是Qt,你可以自由地将c ++ 11启用的版本与c ++ 03版本混合使用。
答案 1 :(得分:3)
您可以考虑不同编译器对C ++的每次转换(即使编译器相同,但具有不同(次要)版本)不兼容。 C ++没有通用的应用程序二进制接口(ABI)。
此外,编译器支持的方言的更改是ABI的更改,因此生成的库不兼容。一个明显的例子是发布构建与调试构建,其中调试数据结构引入了其他成员。
移动结构(C ++ 11)或不移动结构(< C ++ 11)是ABI的根本改变。