2013-10-04 13 views
5

Ich habe eine Frage zur Binärkompatibilität. Ich habe Klasse A, die eine öffentliche Methode foo() und eine Attributzeichenfolge _foo enthält;Binary Kompatibel zum Ändern des Rückgabetyps C++

const string foo() {return _foo;} 

Als ich nach

geändert
const string& foo(){return _foo;} 

Ist es noch binärkompatibel? Danke für Ihre Hilfe!

Antwort

2

wird im Wesentlichen so etwas wie diese eine Kopie einer Zeichenfolge zurückkehrend:

string s = foo(); 

wird, wenn der Compiler Maschinencode erzeugt, ähnlich scheinen:

string s; 
foo(&s); 

Natürlich, wenn Sie das ändern Typ des Rückgabetyps muss der Zeiger auf s entsprechend geändert werden. Nein, Sie können den Rückgabetyp nicht ändern und die Binärkompatibilität beibehalten (und es wird mit ziemlicher Sicherheit nicht einmal kompiliert, da sich die Signatur der Funktion geändert hat -> different mangned name -> "undefined reference").

7

Policies/Binary Compatibility Issues With C++: Das Ziel hier ist die Liste der restriktivsten Bedingungen beim Schreiben plattformübergreifenden C++ - Codes, der mit mehreren verschiedenen Compilern kompiliert werden soll.

Die Do und Don'ts:
... Sie können nicht ...:

  • Änderung der Rückgabetyp in irgendeiner Weise
1

Es ist nicht einmal in der Nähe.

Die erste Version gibt eine temporäre zurück. Der Move-Konstruktor für std::string kann davon abweichen. Die zweite Version gibt einen Verweis auf _foo zurück, aus dem Sie nicht verschieben können.