1. 代码
#include <iostream>
class Vptr {
public:
int a;
};
void funciton(int &a, Vptr *p) {
if(p == nullptr) {
std::cout << "p is nullptr" << std::endl;
} else {
std::cout << a << std::endl;
}
}
int main() {
Vptr *p = nullptr;
funciton(p->a, p);
}
2. 问题分析
-
按照我之前的理解在function调用的这一行会报错,毕竟p是一个空指针怎么能够访问成员a呢?但是神奇的是这里居然没有报错(非常的好奇)...
-
经过AI的解释终于弄明白原因了,这个是解引用的时机的问题(学到了,学到了)...
-
在调用function(p->a, p),由于p是一个nullptr,编译器在编译时将a 绑定到p->a这个地址,但是没有访问这个地址(解引用)
-
在函数体内部由于p 被提前检测为空没有使用到a,所以a不会被解引用,所以不会报错。如果不做条件判断,直接使用a,则必定会报错。