如何测试引用是否为NULL?

mar*_*hon 1 c++ reference operator-overloading

我想检查一下是否为null,例如:

string xxx(const NotMyClass& obj) {
  if (obj == NULL) {
     //...
  }
}
Run Code Online (Sandbox Code Playgroud)

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

所以我尝试了这个:

  if (obj == static_cast<NotMyClass>(NULL)) {
Run Code Online (Sandbox Code Playgroud)

这是因为崩溃NotMyClass==超载不处理空值.

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

在此输入图像描述

Lig*_*ica 7

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

所以不仅答案是"不,没有办法",一个必然结果是"这毫无意义".


关于C的陈述也没有意义,因为C没有引用.

至于Java,它的"引用"在很多方面更像是C++指针,包括这一点.

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


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

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

  const NotMyClass& ref = *ptr;
  /* ... */
}
Run Code Online (Sandbox Code Playgroud)

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


Ker*_* SB 5

你问的是没有意义的.C++中的引用永远不会是"空",因为它们只能通过别名现有对象来创建,并且它们不能被反弹.一旦引用x,总是引用x.

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