Этот вопрос задуман как продолжение этого вопроса: Каковы различия между переменной-указателем и переменной-ссылкой в C++?
Прочитав ответы и некоторые дальнейшие обсуждения, которые я нашел в stackoverflow, я знаю, что компилятор должен обрабатывать передачу по ссылке так же, как он обрабатывает передачу по указателю, и что ссылки - не более чем синтаксический сахар. Одна вещь, которую я еще не смог понять, есть ли какая-то разница с учетом двоичной совместимости.
В нашей (мультиплатформенной) среде у нас есть требование бинарной совместимости между выпусками и отладочными сборками (и между разными версиями платформы). В частности, бинарные файлы, которые мы создаем в режиме отладки, должны быть пригодны для использования с релизными сборками, и наоборот. Для этого мы используем только чистые абстрактные классы и POD в наших интерфейсах.
Рассмотрим следующий код:
class IMediaSerializable
{
public:
virtual tResult Serialize(int flags,
ISerializer* pSerializer,
IException** __exception_ptr) = 0;
//[…]
};
ISerializer
и IException
также являются чистыми абстрактными классами. ISerializer
должен указывать на существующий объект, поэтому мы всегда должны выполнять проверку нулевого указателя. IException
реализует некоторую обработку исключений, при которой адрес, на который указывает указатель, должен быть изменен. По этой причине мы используем указатель на указатель, который также должен быть проверен на NULL-указатель.
Чтобы сделать код более понятным и избавиться от некоторых ненужных проверок во время выполнения, мы хотели бы переписать этот код с использованием передачи по ссылке.
class IMediaSerializable
{
public:
virtual tResult Serialize(int flags,
ISerializer& pSerializer,
IException*& __exception_ptr) = 0;
//[…]
};
Кажется, это работает без каких-либо недостатков. Но нам остается вопрос, удовлетворяет ли это требование бинарной совместимости.
ОБНОВЛЕНИЕ: Чтобы прояснить ситуацию: этот вопрос не касается двоичной совместимости между версией кода с передачей по указателю и версией с передачей по ссылке. Я знаю, что это не может быть двоично-совместимым. На самом деле у нас есть возможность перепроектировать наш API, для которого мы рассматриваем возможность использования передачи по ссылке вместо передачи по указателю, не заботясь о двоичной совместимости (новый основной выпуск). Вопрос касается только двоичной совместимости при использовании только версии кода с передачей по ссылке.