2016-03-23 12 views
14

Perché il mio compilatore MSVC12 non è così?Il distruttore C++ chiama un operatore di cancellazione?

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

L'errore che ottengo è stranamente sulla coppia di main() di chiusura:

errore 2 Errore C2280: 'vuoto cosa :: operator delete (void *)': il tentativo di fare riferimento a una funzione eliminata

Se commento la chiamata al distruttore esplicito, l'errore scompare, il che implica che la chiamata distruttiva esplicita sta tentando di chiamare l'operatore delete (void *). Questo non ha senso intuitivo. Come puoi probabilmente vedere dal codice qui, ho già gestito la mia memoria, e non voglio che nessuno chiami l'eliminazione su cosa mai.

+1

[compila e funziona] (http://coliru.stacked-crooked.com/a/b0c0ca91f45c3887) in gcc5, come dovrebbe. Cosa succede se si compila in modalità di rilascio? – vsoftco

+1

[cpp.sh/3mqd](http://cpp.sh/3mqd) - gcc funziona bene –

+0

Il build di rilascio ha lo stesso errore. Sembra che questo sia un bug del compilatore? – Kumputer

risposta

5

Questo è sicuramente un errore poiché sostituendo semplicemente la chiamata virtuale al distruttore con uno non virtuale: t1->thing::~thing() funziona. Ma ovviamente in questo caso non c'è nessuna eredità implicata e quindi nessuna differenza tra le due forme.

Si può provare e inviare il bug tramite the Microsoft Connect site for VS

+0

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

+0

Il distruttore non è virtuale –

+0

Non lo è, ma una chiamata che utilizza il nome del metodo esplicito viene chiamata chiamata non virtuale. –