编辑:这与 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++ 标准最终允许通过空指针进行间接寻址,它就不能生成原本会绑定(bind)到空指针的表达式或子表达式并创建一个空引用?换句话说,如果标准允许通过空指针进行间接寻址,那么它们可以通过哪些不同的方式允许它?
最佳答案
取消引用 NULL 指针是无效的(即未定义的行为)。
因此永远不可能从 NULL 中获取引用(在有效代码中)。
因此,您获得的任何引用永远不会为 NULL,因此您无需检查它。
First question: does f_ref need to check if &reference_to_c is NULL?
没有。
Second question: if C++ eventually defines the behavior of indirection through a null pointer does this mean f_ref has to check for NULL?
确实如此。它的未定义行为。因此,任何进一步的猜测都是毫无值(value)的。
For one last puzzle, Does f_const_ref have to check &reference_to_c to NULL?
没有。
关于c++ - 标准如何允许通过空指针进行间接寻址?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7071986/