11
votes

Pourquoi VC ++ C4150 (suppression du pointeur au type incomplet) uniquement un avertissement?

Bien sûr, l'avertissement doit être traité, mais pourquoi VC ++ C4150 (suppression du pointeur au type incomplet) seulement un avertissement?


0 commentaires

3 Réponses :


5
votes

Vous obtenez cet avertissement à la suite de la déclaration de terme. Donc, le compilateur a reconnu que c'est une structure / classe, mais pas sûr de l'invocation destructeurs.

Le sens de l'avertissement le plus possible est concerné par la deuxième carte d'analyse de code par MSVC. Lorsque cette dernière classe est résolue Compiler peut prendre une décision si le destructeur existe.


0 commentaires

2
votes

Il est légal en C ++, même si souvent une mauvaise idée.

grossièrement, le niveau d'avertissement 1 est de "Vous pourriez être surpris, mais j'ai ignoré ce que vous avez dit là" Tapez et quelques instructions sélectionnées dans lesquelles le code généré est très probablement incorrect et cassé.

SO WL 2 est approprié, car il est légal et dans de nombreux scénarios totalement ok pour supprimer un type incomplet.

Bien sûr, ce raisonnement n'est qu'une supposition éduquée. Peut-être que Microsoft a roulé les dés pour attribuer ce niveau d'avertissement.


1 commentaires

peut-être que Microsoft a roulé les dés pour affecter ce niveau d'avertissement. : D



12
votes

Parce que la norme dit qu'il est légal, bien que dangereux: 5.3.5

si l'objet étant supprimé a type de classe incomplete au point de Suppression et la classe complète a un destructeur non trivial ou un fonction de distribution, le comportement est indéfini.


1 commentaires

... ce qui signifie que lorsque le destructeur du type est trivial, c'est légal. Comme le compilateur ne connaît pas le type, il ne sait pas si le destructeur est trivial ou non, et incapable de décider si le comportement est indéfini ou non.