标准将如何通过空指针进行间接寻址?
编辑:这与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_c
为NULL
? 顺便说一下,在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_ref
或f_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?