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定义良好吗?)
这是一个四个问题.
&*nullPtr自从C99以来在C语言中有明确的定义,它描述了一元运算&符:
如果操作数是一元运算
*符的结果,则不会对该运算符和&运算符进行求值,结果就好像两者都被省略,[...]
&*nullPtr在C++的所有修订版中都是正式未定义的(通过省略:&指定unary 生成指向"指定对象"的指针,并*指定unary 生成"引用表达式指向的对象[...]的左值" ;空指针值指向无对象),尽管核心问题232的方向是使其明确定义.
&*nonnullptr不产生易失性读数*nonnullptr.一元&期望一个左值操作数; 不执行左值转换(对于C)或左值到右值的转换(对于C++)*nonnullptr.