C ++, предотвращающий создание экземпляра класса в стеке (во время компиляции)

Я знаю, что есть методы, чтобы предотвратить создание класса в куче, предотвращая использование пользователемnew а такжеdelete оператор. Я пытаюсь сделать прямо противоположное. У меня есть класс, который я хочу предотвратить, чтобы пользователь создал его экземпляр в стеке, и только те экземпляры, которые были инициированы с использованиемnew Оператор скомпилирует. В частности, я хочу, чтобы следующий код получал ошибку во время компиляции:

MyClass c1; //compilation error

MyClass* c1 = new MyClass(); //compiles okay

Из поиска в Интернете я нашел это предложение о том, как это сделать:

class MyClass {
public:
    MyClass();
private:
    void destroy() const { delete this; }

...

private:
    ~MyClass();
};

int main(int argc,char** argv)
{
    MyClass myclass; // <--- error, private destructor called here !!!

    MyClass* myclass_ptr = new MyClass;
    myclass_ptr->destroy();
}

Я не понимаю, почему это должно работать. Зачем вызывать деструктор при создании экземпляраMyClass?

Ответы на вопрос(5)

Ваш ответ на вопрос