空引用可能吗? [英] Is null reference possible?

查看:105
本文介绍了空引用可能吗?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

这段代码是否有效(和定义的行为)?

Is this piece of code valid (and defined behavior)?

int &nullReference = *(int*)0;

即使使用-Wall-Wextra-std=c++98-pedantic-Weffc++ ...

Both g++ and clang++ compile it without any warning, even when using -Wall, -Wextra, -std=c++98, -pedantic, -Weffc++...

当然,引用实际上不是空的,因为无法访问它(这意味着取消引用空指针),但是我们可以通过检查其地址来检查它是否为空:

Of course the reference is not actually null, since it cannot be accessed (it would mean dereferencing a null pointer), but we could check whether it's null or not by checking its address:

if( & nullReference == 0 ) // null reference

推荐答案

引用不是指针.

8.3.2/1:

参考应初始化为 引用有效的对象或函数. [注意:尤其是空引用 不能存在于定义明确的位置 程序,因为唯一的方法 创建这样的参考将是 将其绑定到由 解引用空指针, 导致未定义的行为.作为 9.6中所述,引用不能 直接绑定到位域. ]

A reference shall be initialized to refer to a valid object or function. [Note: in particular, a null reference cannot exist in a well-defined program, because the only way to create such a reference would be to bind it to the "object" obtained by dereferencing a null pointer, which causes undefined behavior. As described in 9.6, a reference cannot be bound directly to a bit-field. ]

1.9/4:

描述了某些其他操作 在本国际标准中, 未定义(例如, 取消引用空指针)

Certain other operations are described in this International Standard as undefined (for example, the effect of dereferencing the null pointer)

正如约翰内斯(Johannes)在删除的答案中所说的那样,是否应该将解引用空指针"归类为未定义的行为存在一些疑问.但这不是引起怀疑的情况之一,因为空指针肯定不会指向有效对象或函数",并且标准委员会内部也没有引入空引用的愿望.

As Johannes says in a deleted answer, there's some doubt whether "dereferencing a null pointer" should be categorically stated to be undefined behavior. But this isn't one of the cases that raise doubts, since a null pointer certainly does not point to a "valid object or function", and there is no desire within the standards committee to introduce null references.

这篇关于空引用可能吗?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆