我对二进制兼容性有疑问。我有一个类A,它包含一个公共方法foo()和一个属性字符串_foo;
const string foo() {return _foo;}
当我改为
时const string& foo(){return _foo;}
它仍然是二进制兼容的吗?谢谢你的帮助!
答案 0 :(得分:7)
Policies/Binary Compatibility Issues With C++: 这里的目标是在编写跨平台C ++代码时列出最严格的条件集,这些代码旨在使用多个不同的编译器进行编译。
做与不做:
...
你不能......:
答案 1 :(得分:2)
返回字符串的副本基本上会做这样的事情:
string s = foo();
当编译器生成机器代码时,将显示类似于:
string s;
foo(&s);
当然,如果更改返回类型的类型,则需要适当修改指向s
的指针。所以不,你不能改变返回类型并保持二进制兼容性(它几乎肯定不会编译,因为函数的签名已经改变 - >不同的错误名称 - >“未定义引用”)。
答案 2 :(得分:1)
它甚至不是很接近。
第一个版本返回临时版本。 std::string
的移动构造函数可以远离它。第二个版本返回对_foo
的引用,您无法从中移动。