首页 > 解决方案 > &*NULL 在 C++ 中定义良好吗?

问题描述

在 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 版本:&*NULL 在 C 中是否明确定义?

标签: c++language-lawyer

解决方案


这是四题合一。


&*nullPtr自 C99 以来在 C 中定义良好,其中提到了一元运算&符:

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

参见WG14 N721DR076


&*nullPtr在 C++ 的所有版本中正式未定义(省略:&指定一元以生成指向“指定对象”的指针,指定一元*以生成“引用表达式指向的对象 [...] 的左值” ; 一个空指针值不指向任何对象),尽管核心问题 232的方向是使其明确定义。


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


推荐阅读