为什么允许引用指针的间接寻址?

Why reference to indirection to pointer is allowed?

int *ptr = 0;
int &ref = *ptr;

我在 Visual Studio 中写了上面的代码,它有效吗?这里我指的是NULL。 为什么允许?指针可以取任何地址、NULL 甚至无效地址。仍然允许引用指针的间接寻址?

那为什么说"Reference cannot be null."这里,reference不是指向NULL吗?

不允许。

用标准的话来说:

C++11 8.3.2/5: A reference shall be initialized to refer to a valid object or function.

然而,这不是编译器通常可以诊断的东西,因为指针的有效性是 运行 时间的事情。所以不需要诊断错误,可能没有编译器警告,只是未定义的行为。

标准中特别提到了这种情况:

Note: in particular, a null reference cannot exist in a well-defined program, because the only way to create such a reference would be to bind it to the “object” obtained by dereferencing a null pointer, which causes undefined behavior.