У меня есть вопрос о бинарной совместимости. У меня есть класс A, который включает в себя открытый метод foo () и строку атрибута _foo;
const string foo() {return _foo;}
Когда я изменился на
const string& foo(){return _foo;}
Это все еще двоичный код? Спасибо за вашу помощь!
Возвращение копии строки по существу сделает что-то вроде этого:
string s = foo();
будет, когда компилятор генерирует машинный код, будет выглядеть примерно так:
string s;
foo(&s);
Естественно, если вы измените тип возвращаемого типа, указатель на s
должен быть соответствующим образом изменен. Поэтому нет, вы не можете изменить тип возвращаемого значения и поддерживать двоичную совместимость (и он почти наверняка даже не скомпилируется, так как сигнатура функции изменилась -> имя из другого источника -> «неопределенная ссылка»).
Политики / Проблемы двоичной совместимости с C ++:
Цель здесь состоит в том, чтобы перечислить наиболее ограничивающий набор условий при написании кроссплатформенного кода C ++, предназначенного для компиляции с несколькими различными компиляторами.
Что нужно и чего не нужно:
…
Ты не можешь… :
Это даже не близко.
Первая версия возвращает временную. Конструктор перемещения для std::string
может отойти от этого. Вторая версия возвращает ссылку на _foo
, из которого вы не можете двигаться.