С++ 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.