c++ - &*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 中是否明确定义?)
解决方案
这是四题合一。
&*nullPtr
自 C99 以来在 C 中定义良好,其中提到了一元运算&
符:
如果操作数是一元运算符的结果,则该运算
*
符和该&
运算符都不会被计算,结果就好像两者都被省略了,[...]
&*nullPtr
在 C++ 的所有版本中正式未定义(省略:&
指定一元以生成指向“指定对象”的指针,指定一元*
以生成“引用表达式指向的对象 [...] 的左值” ; 一个空指针值不指向任何对象),尽管核心问题 232的方向是使其明确定义。
&*nonnullptr
不会产生易失性读取*nonnullptr
. 一元&
需要一个左值操作数;不执行左值转换(对于 C)或左值到右值转换(对于 C++)*nonnullptr
。
推荐阅读
- plot - 如何在 Octave 中设置用户定义的颜色图?
- ios - 升级 SDK 后,使用 Facebook 登录在 iOS 11 上没有响应
- c# - 解析具有不同内容的 JSON 响应
- ios - 如何从 url 制作模型、视图模型
- android - 如何在 Android 中使用 SQLcipher 数据库保护 Greendao 使用的密码?
- git - 如何找到将文件更改为当前状态的 Git 提交?
- dialogflow-es - 对话流 Web 挂钩超时
- swift - 多组正则表达式 swift
- css - Odoo 和 WkHtmlToPDF:字体问题
- c# - 尝试使用c#从数据库中返回记录