【发布时间】:2011-10-27 16:05:36
【问题描述】:
编辑:这与C++ Standard Core Language Active Issues 上的活跃问题 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++ 标准最终允许通过空指针进行间接寻址,则它不会导致表达式或子表达式绑定到空指针并创建一个空引用?换句话说,如果标准允许通过空指针进行间接寻址,那么它们可以允许的各种方式是什么?
【问题讨论】:
-
在 C++ 中不能有一个空引用,对吗?
-
我以为你不能有一个空引用?为什么编译器需要检查指针是否为
NULL并返回NULL,如果它可以以任何一种方式返回值?我想我不明白很多东西。 -
这并不是说取消引用空指针是可以的,它只是建议像
&*p这样的表达式应该是有效的,即使在*p可能不是的某些情况下也是如此。不过仍然只是一个建议!