在C ++中&* NULL是否定义明确?

时间:2018-08-05 04:00:25

标签: c++ language-lawyer

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

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

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

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

这个应该是一个带有明显答案的问题,但是(似乎在此类问题上经常发生)我听到很多人说答案“显然没有定义”为“明显”定义”。

相对而言,以下内容如何? foo是否应该产生c的读数?

extern volatile char c;

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

(相同问题的C版本:Is &*NULL well-defined in C?

1 个答案:

答案 0 :(得分:9)

这是四个问题合而为一。


&*nullPtr自C99以来在C语言中定义良好,它表示一元&运算符:

  

如果操作数是一元*运算符的结果,则两者都不是   运算符或&运算符都被求值,结果就像   被省略了,[...]

请参见WG14 N721DR076


&*nullPtr在C ++的所有修订版中都未正式定义(通过省略:一元&被指定产生指向“指定对象”的指针,一元*被指定产生尽管指向core issue 232的方向是为了使它定义得很清楚,但它还是“指向表达式所指向的对象[...]的左值”;空指针值指向无对象)。


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