Вопрос по static, standards, c++, destructor – Как называются частные деструкторы статических объектов? [Дубликат]

7

Possible Duplicate:
Cannot access private member in singleton class destructor

Я реализую синглтон, как показано ниже.

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;
 }

destructor is private, Будет ли это вызвано для объекта theMainInstance, когда программа собирается завершиться?

Я попробовал это в Visual Studio 6, это дало ошибку компиляции.

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

В Visual Studio 2010 это было скомпилировано иdestructor was called.

Каковы должны быть ожидания здесь в соответствии со стандартом?

Редактировать: путаница возникает, поскольку поведение Visual Studio 6 не так глупо. Можно утверждать, что конструктор A для статического объекта вызывается в контексте функции A. Ноdestructor is not called in the context of the same function, Это называется из глобального контекста.

Сначала я думал, что все в порядке, поскольку он создается внутри функции-члена того же класса, но я еще не нашел соответствующую часть стандарта. Vaughn Cato
Этот пример верен, потому что деструктор был вызван «внутри класса» для статической переменной & lt; br & gt; Но для этой ситуации во время компиляции возникает ошибка & lt; br & gt;liveworkspace.org/code/a13eb44e21c01a2b32bd92382722350b Ilya Lavrenov
О MSVC 6.0: 15 лет. Выпущено до Windows XP, ME, Vista. До iPad, iPhone, до смены тысячелетий. Задолго до многоядерных процессоров, когда инструкции MMX были в моде, а SSE, SSE2, SSE3, SSSE3, SSE4, AVX даже не задумывались. 300-400 МГц было много. У вас было 16 кешей KiB L1. Жесткие диски на несколько гигабайт были все еще новыми. Он был разработан до выхода стандарта C ++ 98, который был заменен уже два раза. Не используйте его. Sebastian Mach
Похоже, стандартные махинации Visual Studio снова. Если в версии 6 (6? VS 6?) Есть эта ошибка, а VS2010 нет, я сомневаюсь, что это проблема языка, но проблема компилятора. Linuxios
Я не согласен с тем, что это точный дубликат. Вопрос, который указан как возможный дубликат, задает «Почему это не работает в VC ++ 6?», В то время как этот вопрос задает «как правильно и почему?». Vaughn Cato

Ваш Ответ

1   ответ
4

Раздел 3.6.3.2 стандарта C ++ 03 гласит:

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 доступен в точке объявления, в вашем примере не должно быть ошибок.

@VaughnCato: Это была моя проблема PermanentGuest
Спасибо за информацию, @Vaughn Cato. PermanentGuest
@phresnel: правда. Я ответил на вопрос «что такое правильное поведение». Он попробовал это с двумя разными версиями и получил разные результаты, и ему было интересно, какая из них правильная и по каким причинам.
Ненавижу говорить, но он использует Visual Studio 6.0, выпущенный в 1998 году :(

Похожие вопросы