Двоичная совместимость при изменении типа возврата Переполнение стека

У меня есть вопрос о бинарной совместимости. У меня есть класс A, который включает в себя открытый метод foo () и строку атрибута _foo;

const string foo() {return _foo;}

Когда я изменился на

const string& foo(){return _foo;}

Это все еще двоичный код? Спасибо за вашу помощь!

5

Решение

Возвращение копии строки по существу сделает что-то вроде этого:

string s = foo();

будет, когда компилятор генерирует машинный код, будет выглядеть примерно так:

string s;
foo(&s);

Естественно, если вы измените тип возвращаемого типа, указатель на s должен быть соответствующим образом изменен. Поэтому нет, вы не можете изменить тип возвращаемого значения и поддерживать двоичную совместимость (и он почти наверняка даже не скомпилируется, так как сигнатура функции изменилась -> имя из другого источника -> «неопределенная ссылка»).

2

Другие решения

Политики / Проблемы двоичной совместимости с C ++:
Цель здесь состоит в том, чтобы перечислить наиболее ограничивающий набор условий при написании кроссплатформенного кода C ++, предназначенного для компиляции с несколькими различными компиляторами.

Что нужно и чего не нужно:

Ты не можешь… :

  • изменение типа возврата любым способом
7

Это даже не близко.

Первая версия возвращает временную. Конструктор перемещения для std::string может отойти от этого. Вторая версия возвращает ссылку на _foo, из которого вы не можете двигаться.

1
По вопросам рекламы [email protected]