标准将如何通过空指针进行间接寻址?

编辑:这与C ++标准核心语言活动问题上的活动问题232有关

所以真正的问题是标准如何允许通过空指针间接寻址?

考虑下面的代码:

struct a { int x; };
struct b { int y; };

struct c: a, b { };

b *f(c *pointer_to_c) { return pointer_to_c; }

f(...)必须测试pointer_to_c是否为NULL ,如果是,则返回NULL 。 ( NULL指针总是一个NULL指针,不管你如何转换它。)

现在,考虑以下几点:

b *f_ref(c &reference_to_c) { return &reference_to_c; }

第一个问题: f_ref是否需要检查&reference_to_c是否为NULL ? 第二个问题:如果C ++最终通过空指针定义间接行为,这是否意味着f_ref必须检查NULL ? (我认为答案取决于标准允许的内容,例如,如果它表示“将基准类型的NULL引用未定义为多重继承”,那么答案显然是否定的。)

对于最后一个难题,现在考虑一下:

const b *f_const_ref(const c &reference_to_c) { return &reference_to_c; }

f_const_ref是否必须检查&reference_to_cNULL ? 顺便说一下,在VC ++ 2010中,所有三个函数都被优化为f ,即所有三个函数都会针对NULL测试输入。

那么考虑到你不能在一个定义良好的程序中传递一个空引用,这是否意味着如果C ++标准最终允许通过一个空指针进行间接寻址,它就不会产生一个表达式或子表达式,否则它将绑定到一个空指针并创建一个空引用? 换句话说,如果标准允许通过空指针进行间接寻址,那么它们可以允许的各种方式是什么?


取消引用NULL指针是无效的(即未定义行为)。

因此,从NULL(以有效代码)获取引用是不可能的。

因此,你得到的任何引用永远不会是NULL,因此你不需要检查它。

第一个问题:f_ref是否需要检查&reference_to_c是否为NULL?

没有。

第二个问题:如果C ++最终通过空指针定义了间接行为,这是否意味着f_ref必须检查NULL?

它的确如此。 其未定义的行为。 因此任何进一步的猜测都是毫无价值的。

对于最后一个难题,f_const_ref是否必须检查&reference_to_c为NULL?

没有。


如果你在f_reff_const_ref引用是NULL,你就陷入了未定义行为的境界。

这是未定义的,因为获取NULL引用的唯一方法是取消引用NULL指针。 所以下面是未定义的,尽管在g ++ 4.5.2中它将输出0。

#include <iostream>
struct C {};
C* foo(C& r) {  return &r; }
int main() {
  C* c = NULL;

  std::cout << foo(*c) << std::endl;
  return 0;
}

C ++不允许这样做。 对NULL的引用是非法的,并且在标准方面会导致未定义的行为。

话虽如此,我从来没有见过一个编译器做任何事情比你的期望。

链接地址: http://www.djcxy.com/p/20789.html

上一篇: How would the standard allow indirection through a null pointer?

下一篇: Where do I find the current C or C++ standard documents?