С++ destructor вызывает оператор delete?

Почему мой компилятор MSVC12 не нравится?

#include <new>

class thing
{
public:
    thing() {}
    ~thing() {}
    static void operator delete(void* ptr) = delete;
};

int main()
{
    int g;
    void* p = &g;
    thing* t1 = new(p) thing();
    t1->~thing();

    return 0;
}

Ошибка, которую я получаю, странно на замыкающей скобке main():

Ошибка 2 ошибки C2280: 'void thing:: operator delete (void *)': попытка ссылки на удаленную функцию

Если я прокомментирую явный вызов деструктора, ошибка исчезнет, ​​подразумевая, что явный вызов деструктора пытается вызвать оператор delete (void *). Это не создает интуитивного смысла. Как вы можете видеть из кода здесь, я уже управлял своей собственной памятью, и я не хочу, чтобы кто-нибудь называл delete когда-либо.

Ответы

Ответ 1

Это определенно ошибка так как просто заменяя виртуальный вызов на деструктор неживым: t1->thing::~thing() он работает. Но очевидно, что в этом случае нет наследования и, следовательно, нет разницы между этими двумя формами.

Вы можете попробовать и отправить ошибку через сайт Microsoft Connect для VS

Ответ 2

Консенсус в этом потоке заключается в том, что это ошибка компилятора, уникальная для MSVС++. Я сообщил об этом Microsoft здесь:

https://connect.microsoft.com/VisualStudio/Feedback/Details/2511044

UPDATE: MS сообщает, что проблема устранена и будет доступна в следующем обновлении VS.