Reputation: 726
Why does my MSVC12 compiler not like this?
#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;
}
The error I get is oddly on the closing brace of main():
Error 2 error C2280: 'void thing::operator delete(void *)' : attempting to reference a deleted function
If I comment out the explicit destructor call, the error goes away, implying that the explicit destructor call is trying to call operator delete(void*). This does not make intuitive sense. As you can probably see from the code here, I've already managed my own memory, and I don't want anyone to call delete on thing ever.
Upvotes: 14
Views: 423
Reputation: 726
The consensus in this thread is that this is a compiler bug unique to MSVC++. I have reported this to Microsoft here:
https://connect.microsoft.com/VisualStudio/Feedback/Details/2511044
UPDATE: MS reports that the issue is resolved and will be available in the next VS update.
Upvotes: 3
Reputation: 71
This is definitely a bug
since by simply replacing the virtual call to the destructor with a nonvirtual one: t1->thing::~thing()
it works. But obviously in this case there is no inheritance involved and therefore no difference between the two forms.
You can try and submit the bug through the Microsoft Connect site for VS
Upvotes: 5