c++ - 标准如何允许通过空指针进行间接寻址?

标签 c++ reference standards

编辑:这与 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_cNULL?顺便说一下,在 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/

相关文章:

c++ - std::sort 用于 vector 在排序自定义对象时引发错误

java - 将值传递给回调函数

c++ - 如何在 C++ 中引用结构组件

c++ - 为什么 C++ 中的引用不是 "const"?

javascript - 赋值表达式的标准格式是什么?

php - 我可以从类外部的特征中调用静态函数吗?

c++ - 为 clion (windows) 配置 SFML

派生类的 C++ reinterpret_cast

c++ - 查看在 Visual C++ 2008 调试器中分配为 char 的内存位置上的整数

c - 为什么没有在 C 中定义 char 的符号?