2013-10-04 7 views
5

Ho una domanda sulla compatibilità binaria. Ho classe A, che include un metodo pubblico foo() e una stringa di attributi _foo;Binario Compatibile sulla modifica del tipo di ritorno C++

const string foo() {return _foo;} 

Quando ho cambiato per

const string& foo(){return _foo;} 

E 'ancora compatibile binario? Grazie per l'aiuto!

risposta

2

Tornando una copia di una stringa sarà essenzialmente fare qualcosa di simile:

string s = foo(); 

sarà, quando il compilatore genera codice macchina, appaiono simili a:

string s; 
foo(&s); 

Naturalmente, se si modifica la tipo del tipo restituito, il puntatore a s deve essere opportunamente modificato. Quindi no, non è possibile modificare il tipo restituito e mantenere la compatibilità binaria (e quasi certamente non verrà nemmeno compilato, poiché la firma della funzione è cambiata -> differnet nome storpiato -> "riferimento non definito").

7

Policies/Binary Compatibility Issues With C++: L'obiettivo qui è elencare il set di condizioni più restrittive quando si scrive codice C++ multipiattaforma, che deve essere compilato con diversi compilatori diversi.

La Cosa fare e cosa non fare:
... Non puoi ...:

  • cambiando il tipo di ritorno in qualsiasi modo
1

Non è nemmeno vicino.

La prima versione restituisce un valore temporaneo. Il costruttore di mosse per std::string può allontanarsi da quello. La seconda versione restituisce un riferimento a _foo, da cui non è possibile spostarsi.