空引用可能吗? [英] Is null reference possible?
问题描述
这段代码是否有效(和定义的行为)?
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屋!