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

Pat*_*ick 6 c++ arguments reference visual-studio-2010

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

void doSomethingWithCustomer (const Customer &customer);
Run Code Online (Sandbox Code Playgroud)

我的一位开发人员称之为:

Customer *customer = order.getCustomer();
doSomethingWithCustomer (*customer);
Run Code Online (Sandbox Code Playgroud)

不幸的是,getCustomer如果订单没有绑定到客户,该方法可以返回nullptr.如果getCustomer返回nullptr,则应用程序在调用时不会崩溃,doSomethingWithCustomer而是在使用客户引用的函数内崩溃.

当然,写这个的正确方法是首先检查客户不是nullptr,然后如果我们有一个有效的客户则调用该函数.通常我们期望如果函数/方法具有引用参数,则调用者检查它的有效性(这不是这里的情况),而不是函数本身检查参数.

我知道Visual Studio 2010(和早期版本)通过实际传递指针来传递引用,但我想知道这是否在C++标准中的某处显示.我们可以假设引用始终作为指针传递(个人而言,我不会依赖于此,但知道它是有趣的)?

是否有可能告诉Visual Studio在传递引用时,它应该首先自动取消引用它并在调用时崩溃而不是更深一些(在调试版本中执行此操作可能就足够了)?

Alo*_*ave 4

假设引用作为指针传递是否有效?

不它不是。
该标准并不强制要求引用应该以指针的形式实现。

如何实际实现参考是一个实现细节,该标准没有由实现来决定。它仅描述引用的预期行为,其中之一是引用永远不能出现NULL在标准一致的程序中。

如果您的函数参数有时是预期的,NULL那么您应该将其作为指针传递。

  • “其中之一是在标准一致的程序中引用永远不能为 NULL”——因此,例如,如果您输入 `if (&customer == 0) throwlogic_error("null reference");` 那么优化器就被允许删除整个语句,因为它是一个在具有已定义行为的程序中始终为假的条件,后面是死代码。 (5认同)