如何取消引用nullptr以返回正确的对象?

时间:2018-11-04 16:21:38

标签: c++ undefined-behavior

我一直试图在C ++中实现单例类。

#include<iostream>
using namespace std;

class Singleton {
private:
static Singleton* singleton;
public:
static Singleton& Get() {
    return *singleton;
}
static void display() {
    cout << "Hello world\n";
}
};

Singleton* Singleton::singleton = nullptr;
int main() {
Singleton::Get().display();
return 0 ;
}

程序运行正常。 任何人都可以帮助我了解如何取消引用nullptr并在类的“获取”功能中返回对象引用。

2 个答案:

答案 0 :(得分:4)

这由core language issue 315: Is call of static member function through null pointer undefined? 覆盖:

  

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

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

在12.2.2中明确指出未定义   [class.mfct.non-static],即使有人会争辩说因为f()是   空,没有左值->右值转换。

     

但是,如果f为静态,则似乎没有这样的规则,因此调用   仅在->运算符中隐式取消引用为   未定义。 IMO应该是。

     

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

     

这与issue 232有关。

,回复为:

  

我们同意应允许使用该示例。根据8.2.5 [expr.ref],p-> f()被重写为(* p).f()。如果p为null,除非将左值转换为右值(7.1 [conv.lval]),否则* p不是错误。

答案 1 :(得分:0)

基本上,这是因为Singleton中的所有内容都是静态的。添加数据元素并对其进行处理,您将更有可能发现问题。