5

我有一个关于二进制兼容性的问题。我有 A 类,它包括一个公共方法 foo() 和一个属性字符串 _foo;

const string foo() {return _foo;}

当我改为

const string& foo(){return _foo;}

它仍然是二进制兼容的吗?谢谢你的帮助!

4

3 回答 3

7

C++ 的策略/二进制兼容性问题:此处的目标是列出编写跨平台 C++ 代码时最严格的条件集,这些代码旨在使用几种不同的编译器进行编译。

该做什么和不该做什么:
......你不能......:

  • 以任何方式更改返回类型
于 2013-10-04T07:33:07.737 回答
2

返回一个字符串的副本基本上会做这样的事情:

string s = foo();

当编译器生成机器代码时,会出现类似于:

string s;
foo(&s);

自然,如果更改返回类型的类型,则s需要适当修改指向的指针。所以不,你不能改变返回类型并保持二进制兼容性(它几乎肯定不会编译,因为函数的签名已经改变 -> 不同的重命名 -> “未定义的引用”)。

于 2013-10-04T07:37:40.633 回答
1

它甚至不接近。

第一个版本返回一个临时的。的移动构造函数std::string可以远离它。第二个版本返回对 的引用_foo,您不能从中移动。

于 2013-10-04T07:36:30.100 回答