c++ - 假设引用作为指针传递是否有效

标签 c++ visual-studio-2010 reference arguments

我有一个这样定义的函数:

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/

相关文章:

c++ - insert_iterator 失效规则

c# - 是否可以在无需通过远程桌面连接的情况下运行编码的 UI 测试?

visual-studio-2010 - 无法在 VS 2010 项目中添加 ADO.NET 数据服务项

c++ - 多重定义错误 : How to declare a reference in a header file?

c# - 将对象的引用传递给新线程

rust - move 原始实例后,不会反射(reflect)使用字段可变引用的更改

c++ - 使用 portaudio 回调已连接/未连接的设备?

c++ - 如果我已经重载了 << 和 >> 运算符,如何获取 ostream

c++ - C++ 编译器中的可变长度数组 (VLA)

visual-studio-2010 - 在 SharePoint 2010 列表定义中隐藏 View 的文件夹结构