如何测试引用是否为NULL?

时间:2011-11-07 00:47:29

标签: c++ operator-overloading reference

我想检查某些东西是否为空,例如:

string xxx(const NotMyClass& obj) {
  if (obj == NULL) {
     //...
  }
}

但是编译器抱怨这个:==有5种可能的重载。

所以我尝试了这个:

  if (obj == static_cast<NotMyClass>(NULL)) {

这会崩溃,因为NotMyClass的{​​{1}}重载不会处理空值。

编辑:对于每个人都告诉我它不能为NULL,我肯定会在我的调试器中得到一些NULL:

enter image description here

5 个答案:

答案 0 :(得分:7)

在格式良好的C ++程序中,引用永远不会NULL(更准确地说,您引用的对象的地址可能永远不会是NULL)。

所以不仅答案是“不,没有办法”,一个必然结果是“这没有意义”。


关于C的陈述也没有意义,因为C没有参考。

至于Java,它的“引用”在很多方面更像是C ++指针,包括这个。

比较不同语言之间的这种特定行为是一件愚蠢的事情。


如果您需要这个“可选对象”行为,那么您正在寻找指针:

std::string xxx(const NotMyClass* ptr) {
  if (ptr == NULL)
     throw SomeException();

  const NotMyClass& ref = *ptr;
  /* ... */
}

但考虑一下你是否真的需要这个;如果你真的那样,一个不错的选择可能是boost::optional

答案 1 :(得分:5)

你问的是没有意义的。 C ++中的引用永远不会是“空”,因为它们只能通过别名现有对象来创建,并且它们不能被反弹。引用x后,始终引用x

(如果原始对象的生命周期在引用之前结束,则引用可能变为“悬空”,但这是编程错误而不是可检查的运行时条件。)

答案 2 :(得分:4)

您不需要对此进行测试,因为C ++中的引用不能为NULL。 指针可以为NULL,但您不是在这里使用它们。

答案 3 :(得分:2)

正如其他人所说,明确定义的代码永远不会有NULL引用,因此测试它们不是你的责任。

这并不严格意味着它们在实践中从未被创造过(但希望在中间而不是生产代码中)。在某些编译器中,虽然绝对不是标准的C ++,但是可以获得地址为NULL的引用:

int * p = NULL;
int & x = *p;

通常不会崩溃(但是),尽管通过C ++标准,它在第二行之后是不确定的行为。这是通常使用“幕后”指针实现的引用的副作用。当有人使用x时,它可能会在以后崩溃。

如果您正在尝试调试这种情况,可以测试x的地址是否为NULL:

#include <cassert>
// ...
assert(&x != NULL);

答案 4 :(得分:1)

正如人们所说,C ++中的引用永远不应该为null(NULL或nullptr),但是仍然可以获得空引用,特别是如果你做了一些邪恶的转换。 (很久以前,当我不知道更好的时候,我做了这样的事情。)

要测试引用是否为null(NULL或nullptr),请将其转换为指针然后进行测试。所以:

if (&obj == nullptr)

是你有效寻找的。

但是既然你知道怎么做,不要。假设引用永远不会为null,并且如果它们是应用程序就会崩溃,因为到那时其他东西必定已经出现了可怕的错误并且应该终止该程序。