&*NULL 在C++中是否定义良好?

Is &*NULL well-defined in C++?

本文关键字:定义 是否 NULL C++      更新时间:2023-10-16

在C++标准的哪个版本(如果有的话(中,以下内容定义良好?

void foo(void) {
char *nullPtr = NULL;
&*nullPtr;
}

请注意,我在这里特别询问&*nullPtr。我知道简单的*nullPtr是未定义的,但这是一个单独的问题,因此当前链接的"重复"不是重复。

请注意,我没有将结果分配给任何东西——第二行是一个简单的语句。

这个应该是一个有明显答案的问题,但是(就像在这样的问题上经常发生的那样(我听到很多人说答案是"明显未定义的"answers"明显定义的"。

在一个相当相关的问题上,以下内容如何?foo是否应该产生对c的读取?

extern volatile char c;
void bar(void) {
volatile char *nonnullptr = &c;
&*nonnullptr;
}

(同样问题的C版本:&*NULL在C中定义良好吗?(

这是四个问题合一。


&*nullPtr自C99以来在C中定义良好,这说明了一元&算子:

如果操作数是一元*运算符的结果,则运算符和&运算符都不进行求值,结果就好像两者都被省略,[…]

参见WG14 N721和DR076。


&*nullPtr在C++的所有修订版中都是形式上未定义的(通过省略:一元&被指定为产生指向"指定对象"的指针,一元*被指定为生成"引用表达式所指向的对象[…]的左值";空指针值不指向任何对象(,尽管核心问题232的方向是使其定义明确。


&*nonnullptr不产生对*nonnullptr的易失性读取。一元&需要一个左值操作数;对于CCD_ 14不执行左值转换(对于C(或左值到右值转换(针对C++(。