静态对象的析构函数私有如何叫什么名字? [重复](How are the private des

2019-06-26 08:33发布

可能重复:
在单例类的析构函数不能访问私有成员

我如下实施单。

class A
{
public:

    static A& instance();
private:
    A(void)
    {
        cout << "In the constructor" << endl;
    }
    ~A(void)
    {
        cout << "In the destructor" << endl;
    }

};

A& A::instance()
{
    static A theMainInstance;
    return theMainInstance;
}

int main()
{
    A& a = A::instance();

    return 0;
 }

析构函数是私有的 。 这会不会被调用为当程序即将终止对象theMainInstance?

我想这在Visual Studio 6中,它给了编译错误。

"cannot access private member declared in class..."

在Visual Studio 2010中,这引起了编译和析构函数被调用

你应该根据标准是期望在这里?

编辑:所以产生了困惑,因为Visual Studio的6行为也不是那么愚蠢。 可以认为,A对静态对象的构造被称为A的功能的情况下,但析构函数是不是在同一个函数的情况下调用 。 这是从全球范围内调用。

Answer 1:

在C ++ 03标准的第3.6.3.2说:

Destructors for initialized objects of static storage duration (declared at block scope or at namespace scope) are called as a result of returning from main and as a result of calling exit.

它没有给出关于其私人析构函数任何限制,所以基本上如果它被创建它也将被摧毁。

私人析构函数确实会导致上声明一个对象(C ++ 03 12.4.10)的能力的限制

A program is ill-formed if an object of class type or array thereof is declared and the destructor for the class is not accessible at the point of declaration

但由于A :: theMainInstance的析构函数是在声明的时候访问,你的榜样应该没有错误。



文章来源: How are the private destructors of static objects called? [duplicate]