C++标准:解除引用NULL指针以获取引用?

sho*_*osh 33 c++ null pointers reference

我想知道C++标准对这样的代码的说法:

int* ptr = NULL;
int& ref = *ptr;
int* ptr2 = &ref;
Run Code Online (Sandbox Code Playgroud)

在实践中,结果是ptr2NULL,但我想知道,这只是一个实现细节还是在标准中明确定义?
在不同的情况下,取消引用NULL指针应该导致崩溃,但是在这里我取消引用它以获得由编译器作为指针实现的引用,因此实际上没有实际的解除引用NULL.

Mic*_*urr 46

取消引用NULL指针是未定义的行为.

事实上,该标准将这种确切的情况称为注释(8.3.2/4"参考文献"):

注意:特别是,在一个定义良好的程序中不能存在空引用,因为创建这样一个引用的唯一方法是将它绑定到通过解引用空指针获得的"对象",这会导致未定义的行为.


旁白:有一次我意识到NULL指针可以以明确定义的方式"解引用"作为操作sizeof符的操作数,因为操作数sizeof实际上没有被计算(所以dereference实际上从未实际发生).

  • 事实上,如果它是`typeid`的操作数,并且如果它是`PolymorphClass*`类型的空指针,那么它被取消引用*和*.它仍然定义明确(抛出'bad_typeid`).我真的不喜欢那种特殊的`typeid`治疗方法. (5认同)
  • 不允许NULL引用是不幸的.它展示了一些很酷的属性,但我想它只会使代码复杂化.:(如果前提条件可用并且代码可以更好地验证,则可以安全地使用NULL引用. (2认同)

Gor*_*pik 5

取消引用 NULL 指针是 C++ 标准中明确未定义的行为,因此您看到的是特定于实现的。

复制 C++0x 草案标准中的 1.9.4(这方面与之前的标准类似):

某些其他操作在本国际标准中被描述为未定义(例如,取消引用空指针的影响)。[:本国际标准对包含未定义行为的程序的行为没有任何要求。-尾注]

  • 注释不规范。事实上,由于 [DR 1102](http://www.open-std.org/jtc1/sc22/wg21/docs/cwg_defects.html#1102),该注释已被删除,其理由是它不是取消引用空指针的未定义行为。 (4认同)
  • 这很有趣,因为没有人能够表明在标准取消引用中,空指针在哪里被显式地设置为 UB。这里的标准是不正确的。 (3认同)
  • “8.3.2.5”顺便说一句,拼写为 8.3.2/5。没有 8.3.2.5 节。“_任何未显式定义的行为都被视为未定义_”你是对的:只有当指针指向对象时,才定义取消引用指针。但如果标准明确说明这一点,情况会更加清晰——并且在这个非问题上花费的电子墨水会更少。 (3认同)
  • @curiousguy:8.3.2.5 再次暗示取消引用空指针是未定义的。但你是对的,它这样做就好像在其他地方解释过一样。无论如何,1.3.13 解释了任何未明确定义的行为都被视为未定义,因此可能是这种情况。 (2认同)