Perché VC ++ C4150 (soppressione del puntatore al tipo incompleto), solo un avvertimento?
-
13-09-2019 - |
Domanda
Naturalmente, avviso deve essere trattata, ma perché è VC ++ C4150 (soppressione del puntatore al tipo incompleto) solo un avvertimento?
Soluzione
A causa di serie dice che è legale, anche se pericoloso: 5.3.5
Se l'oggetto viene eliminato ha tipo di classe incompleta al punto di la cancellazione e la classe completa ha un non banale distruttore o un funzione deallocazione, il comportamento è non definito.
Altri suggerimenti
Si ottiene questo avvertimento come risultato della dichiarazione anticipata. Così compilatore ha riconosciuto che si tratta di struttura / classe, ma non è sicuro di invocazione del distruttore.
Il senso di avvertimento più possibile si occupa di secondo passaggio del codice di analizzare da msvc. Quando quest'ultima classe è risolto compilatore può prendere una decisione, se esiste distruttore.
E 'legale in C ++, anche se abbastanza spesso una cattiva idea.
Approssimativamente, allarme per il livello 1 sono dei "potreste essere sorpresi, ma ho ignorato quello che hai detto c'è" tipo, e un paio di dichiarazioni selezionati in cui il codice generato è molto probabile che non corretta e crash-prona.
Quindi WL 2 è appropriato, dal momento che è legale e in molti scenari del tutto OK per eliminare un tipo incompleto.
Naturalmente, questo ragionamento è solo un'ipotesi. Forse Microsoft rotolato i dadi per assigne questo livello di avviso.