&*NULL 在C++中是否定义良好?
Is &*NULL well-defined in C++?
在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++(。
相关文章:
- 此递归模板类型定义是否有效C++?
- 虚拟成员函数的定义是否强制在同一转换单元中动态初始化静态数据成员?
- 越界成员函数定义是否需要一个完全限定的类名,直到全局范围
- C++标准是否定义了结构中成员函数的函数内定义是否必须具有静态链接?
- 带有"struct structname<..>"的模板定义是否正确?
- NTRUEncrypt:使用开源标准算法中的描述无法正确找到两个多项式的GCD,无法定义是否存在多边形的逆
- 定义重载C++函数模板的原型时,使用其名称引用以前的定义是否合法?
- 命名空间的定义是否可以跨越多个翻译单元
- 头文件中的类声明和定义是否在每个包含上编译
- 这个无括号的C预处理器定义是否安全
- char的实现定义是否会影响std::string
- 对内联函数有不同的定义是否是一种未定义的行为
- 同一字符串的多个#定义是否使用相同的常量字符串
- 根据编译时常量,使用相同的标识符 #define 或类型定义是否被认为是可接受的做法?
- 显式模板实例化定义是否也抑制隐式实例化
- 构造函数定义是否可以以 "class" 关键字为前缀?
- 类中的函数定义是否占用类大小的一部分?
- 名称空间作用域构造函数定义是否需要类限定的标识符
- i=i++;未定义.是否i=foo(i++)也未定义
- "volatile"的定义是否如此不稳定,还是 GCC 存在一些标准合规性问题?