这个问题旨在作为这个问题的后续问题:C++ 中的指针变量和引用变量有什么区别?
阅读了我在 stackoverflow 上找到的答案和一些进一步的讨论后,我知道编译器应该像对待传递指针一样对待传递引用,并且引用只不过是语法糖。考虑到二进制兼容性,我还无法弄清楚一件事是否有任何区别。
在我们的(多平台)框架中,我们要求在发布和调试版本之间(以及框架的不同版本之间)二进制兼容。特别是,我们在调试模式下构建的二进制文件必须可用于发布版本,反之亦然。为此,我们只在接口中使用纯抽象类和 POD。
考虑以下代码:
class IMediaSerializable
{
public:
virtual tResult Serialize(int flags,
ISerializer* pSerializer,
IException** __exception_ptr) = 0;
//[…]
};
ISerializer
也是IException
纯抽象类。ISerializer
必须指向一个现有的对象,所以我们总是必须执行一个 NULL 指针检查。IException
实现某种异常处理,其中指针指向的地址必须更改。出于这个原因,我们使用指向指针的指针,它也必须进行 NULL 指针检查。
为了使代码更加清晰并摆脱一些不必要的运行时检查,我们希望使用 pass-by-reference 重写此代码。
class IMediaSerializable
{
public:
virtual tResult Serialize(int flags,
ISerializer& pSerializer,
IException*& __exception_ptr) = 0;
//[…]
};
这似乎没有任何缺陷。但是这是否仍然满足二进制兼容性的要求仍然是我们的问题。
更新: 澄清一下:这个问题与代码的指针传递版本和引用传递版本之间的二进制兼容性无关。我知道这不能是二进制兼容的。事实上,我们有机会重新设计我们的 API,我们考虑使用传递引用而不是传递指针而不关心二进制兼容性(新的主要版本)。当仅使用代码的传递引用版本时,问题只是关于二进制兼容性。