2013-10-04 34 views
5

我有一個關於二進制兼容性的問題。我有類A,它包含一個公共方法foo()和一個屬性字符串_foo;二進制兼容關於更改返回類型C++

const string foo() {return _foo;} 

當我改變

const string& foo(){return _foo;} 

這還算是二進制兼容的?謝謝你的幫助!

回答

2

返回一個字符串的副本將基本上做這樣的事情:

string s = foo(); 

會,當編譯器生成的機器代碼,出現類似:

string s; 
foo(&s); 

當然,如果你改變返回類型,指向s的指針需要適當修改。所以,不能,你不能改變返回類型並保持二進制兼容性(並且幾乎肯定不會編譯,因爲函數的簽名已經改變 - >不同的錯位名稱 - >「未定義的引用」)。

7

Policies/Binary Compatibility Issues With C++: 這裏的目標是在編寫跨平臺C++代碼時列出最嚴格的條件集,這些代碼旨在用幾種不同的編譯器編譯。

該做與不該做:
... 你不能...:

  • 以任何方式
1

它甚至還沒有接近改變返回值類型。

第一個版本返回一個臨時的。 std::string的移動構造函數可以從此移開。第二個版本返回對_foo的引用,從中您不能移動。

相關問題