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

TLW*_*TLW 10 c++ language-lawyer

C++标准的哪个版本(如果有的话)是以下定义明确的?

void foo(void) {
    char *nullPtr = NULL;
    &*nullPtr;
}
Run Code Online (Sandbox Code Playgroud)

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

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

应该是一个有明显答案的问题,但是(就像在这些问题上看似经常发生的那样)我听到的同样有很多人说答案"明显未定义"为"明确定义".

在一个相当相关的说明,以下是什么?应该foo产生一个c?

extern volatile char c;

void bar(void) {
    volatile char *nonnullptr = &c;
    &*nonnullptr;
}
Run Code Online (Sandbox Code Playgroud)

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

T.C*_*.C. 9

这是一个四个问题.


&*nullPtr自从C99以来在C语言中有明确的定义,它描述了一元运算&符:

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

WG14 N721DR076.


&*nullPtr在C++的所有修订版中都是正式未定义的(通过省略:&指定unary 生成指向"指定对象"的指针,并*指定unary 生成"引用表达式指向的对象[...]的左值" ;空指针值指向无对象),尽管核心问题232的方向是使其明确定义.


&*nonnullptr不产生易失性读数*nonnullptr.一元&期望一个左值操作数; 不执行左值转换(对于C)或左值到右值的转换(对于C++)*nonnullptr.

  • 这是......很有趣.所以换句话说,在C++中,它是用于UB目的的解除引用,但是_ not not_用于挥发物的目的?一致性. (2认同)