在 Xcode 6.3 下,NULL C++ 引用地址计算为非零

Under Xcode 6.3, NULL C++ reference address evaluates as non-zero

类似于这个问题:

使用 C++,我发现以前用于计算空指针的工作代码停止工作:

struct AStruct
{
    int x, y;
    char *name;
};

AStruct& GetStruct()
{
   return *(AStruct*)0;
}

int main(int argc, const char * argv[]) {

    AStruct& mys = GetStruct();

    if ( ! &mys) {
        printf("null pointer \n");
    }
    else
    {
        printf("NOT a null pointer\n");
    }

    return 0
}

这总是打印出来 NOT a null pointer

我尝试过其他检查指向引用的指针的方法:

if ( &mys == NULL)

if ( &mys == nullptr )

None 个有效。

然后我注意到警告:

Reference cannot be bound to dereferenced null pointer in well-defined C++ code; comparison may be assumed to always evaluate to false

但是没有建议的修复。

目前检查空指针的规范方法是什么?

您不是在检查指针,而是在检查引用。

引用不应该是 nullptr,因为它们必须引用现有值。事实上,你在做什么 *(AStruct*)0 没有明确定义,因为引用不应该能够通过 "dereferencing it" 生成未定义的行为,但这样你可能会触发问题。

如果客户端代码有 AStruct& 那么可以确定引用指向某物,你正在打破这个条件。

如果您需要使用可以为空的引用,请使用指针,例如

AStruct* GetStruct()
{
  return nullptr;
}

if (!GetStruct())
{
  ...

该代码在 Xcode 的先前版本中运行的事实表明这不是定义明确的代码。

你那里没有指针; mys 是参考。然后当你检查&mys的值时,你正在检查引用的地址。