我有一个这样定义的函数:
void doSomethingWithCustomer (const Customer &customer);
我的一位开发人员这样调用它:
Customer *customer = order.getCustomer();
doSomethingWithCustomer (*customer);
不幸的是,如果订单没有绑定(bind)到客户,getCustomer
方法可以返回一个 nullptr。
如果 getCustomer
返回 nullptr,则应用程序不会在调用 doSomethingWithCustomer
时崩溃,而是在使用客户引用的函数内崩溃。
当然,正确的写法是先检查客户是否为 nullptr,然后在我们有有效客户时调用该函数。 通常我们期望如果一个函数/方法有一个引用参数,那么调用者会检查它的有效性(这里不是这种情况),而不是函数本身检查参数。
我知道 Visual Studio 2010(及更早版本)通过实际传递指针来传递引用,但我想知道这是否在 C++ 标准的某处指明。我们是否可以假设引用总是作为指针传递(就我个人而言,我不会依赖这一点,但了解它很有趣)?
是否可以告诉 Visual Studio 在传递引用时,它应该首先自动解除引用并在调用时崩溃,而不是在更深层次的地方崩溃(在调试版本中这样做可能就足够了)?
最佳答案
Is it valid to assume that a reference is passed as a pointer?
不,不是。
该标准不强制引用应根据指针来实现。
如何实际实现引用是标准遗漏的实现细节,由实现决定。它仅描述引用的预期行为,其中之一是在符合标准的程序中引用永远不能为 NULL
。
如果您的函数参数有时预计为 NULL
,那么您应该将其作为指针传递。
关于c++ - 假设引用作为指针传递是否有效,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13470035/