如何取消对nullptr的屏蔽,返回正确的对象

How derefencing of a nullptr giving back the correct object?

本文关键字:屏蔽 返回 对象 nullptr 何取消 取消      更新时间:2023-10-16

我一直在尝试用C++实现一个单例类。

#include<iostream>
using namespace std;
class Singleton {
private:
static Singleton* singleton;
public:
static Singleton& Get() {
return *singleton;
}
static void display() {
cout << "Hello worldn";
}
};
Singleton* Singleton::singleton = nullptr;
int main() {
Singleton::Get().display();
return 0 ;
}

这个程序运行良好。有人能帮我理解取消引用nullptr是如何在类的"Get"函数中返回对象引用的吗。

核心语言问题315涵盖了这一点:通过空指针调用静态成员函数是否未定义?上面写着:

另一个需要考虑的实例是调用成员函数从空指针:

struct A { void f () { } };
int main ()
{
A* ap = 0;
ap->f ();
}

12.2.2中明确指出未定义[class.mfct.non-static],尽管有人可能会争辩说,由于f((是为空,没有左值->右值转换。

然而,如果f是静态的,则似乎没有这样的规则,并且调用仅当->运算符中隐含的取消引用为未定义。IMO应该是。

顺便说一句,另一件应该清理的事情是"间接引用"answers"取消引用"的使用不一致。我们应该选择一(此术语问题已分解为问题342。(

这与问题232有关。

,响应为:

我们同意应该允许这个例子。根据8.2.5[expr.ref],p->f((被重写为(*p(.f((。当p为null时,*p不是错误,除非左值被转换为右值(7.1[conv.val](,而右值不在这里。

基本上,这是因为Singleton中的所有内容都是静态的。添加一个数据元素并对其执行某些操作,您将更有可能看到问题。