我想知道C++标准对于这样的代码有何规定:
int* ptr = NULL;
int& ref = *ptr;
int* ptr2 = &ref;
实际情况是,ptr2
是 NULL,但我想知道,这只是一个实现细节,还是在标准中有明确规定?
在不同的情况下,对 NULL 指针进行解引用应该会导致崩溃,但在这里,我正在将其解引用以获得由编译器实现为指针的引用,因此实际上并没有解引用 NULL。
我想知道C++标准对于这样的代码有何规定:
int* ptr = NULL;
int& ref = *ptr;
int* ptr2 = &ref;
实际情况是,ptr2
是 NULL,但我想知道,这只是一个实现细节,还是在标准中有明确规定?
在不同的情况下,对 NULL 指针进行解引用应该会导致崩溃,但在这里,我正在将其解引用以获得由编译器实现为指针的引用,因此实际上并没有解引用 NULL。
对空指针进行引用是未定义的行为。
实际上,标准在注释中(8.3.2/4“引用”)明确指出了这种情况:
注意:特别地,在一个良定义的程序中不存在空引用,因为创建这样的引用的唯一方法是将它绑定到通过对空指针进行引用而获得的“对象”,这会导致未定义的行为。
顺便提一下:我知道唯一可以以良定义方式“解引用”空指针的情况是作为 sizeof
运算符的操作数,因为 sizeof
的操作数实际上并没有被计算(所以永远不会真正发生解引用)。
typeid
的操作数,且是类型为PolymorphClass*
的空指针,则它将被解引用并评估。尽管如此,这仍是明确定义的(引发bad_typeid
异常)。我真的不喜欢那个特殊的typeid
处理。 - Johannes Schaub - litb解除引用空指针是未定义的行为。在解除引用之前,您应该检查值是否为NULL。
int& ref = *ptr;
上述语句实际上并没有解除引用任何内容。因此,在使用 ref
(无效)之前是没有问题的。
*
实际上是解引用运算符,它真正执行的是解引用操作。 - curiousguy*ptr
是什么? - curiousguy*ptr
确实是一个解引用。但这并不意味着它实际上被执行(评估)。例如,您可以编写sizeof(*ptr)
,表达式*ptr
在运行时保证不会被评估。 - valdosizeof
的操作数不会被求值:你可以毫无问题地写下 sizeof(1./0.)
。这是因为 sizeof
只关心其操作数的类型。另一方面,&
的操作数会被求值,否则“地址运算符”应用于什么呢? - curiousguy