Por supuesto, la advertencia debe ser tratada, pero ¿por qué es VC++ C4150 (supresión del puntero al tipo incompleto) solamente una advertencia?¿Por qué VC++ C4150 (eliminación del puntero al tipo incompleto) solo es una advertencia?
Respuesta
Debido norma dice que es legal, aunque peligrosa: 5.3.5
Si el objeto se va a eliminar tiene tipo de clase incompleta en el punto de eliminación y la clase completa tiene un destructor no trivial o una función de desasignación , el comportamiento es undefined.
Recibirá esta advertencia como resultado de la declaración directa. Así que el compilador ha reconocido que es estructura/clase, pero no está seguro acerca de la invocación del destructor.
El sentido de advertencia más posible se refiere al segundo paso del código analizado por msvc. Cuando se resuelve la última clase, el compilador puede tomar una decisión si existe un destructor.
Es legal en C++, aunque a menudo es una mala idea.
En general, el Nivel de advertencia 1 es del tipo "podría sorprender, pero ignoré lo que dijo allí", y algunas afirmaciones seleccionadas donde el código generado es muy probable incorrecto y propenso a bloqueos.
Así que WL 2 es apropiado, ya que es legal y en muchos escenarios está bien borrar un tipo incompleto.
Por supuesto, ese razonamiento es solo una suposición educada. Tal vez Microsoft rodó los dados para asignar este nivel de advertencia.
'Tal vez Microsoft tiró los dados a este cedida level.' advertencia: D –
- 1. LibPNG 1.5.10 error: eliminación de referencias puntero al tipo incompleto
- 2. Supresión del puntero al tipo incompleto y punteros inteligentes
- 3. "parámetro tiene tipo incompleto" advertencia
- 4. programación C: Desreferenciar puntero al error de tipo incompleto
- 5. typedef e incompleto tipo
- 6. ¿Por qué filter_input() está incompleto?
- 7. ¿Qué significa la advertencia C4250 VC++?
- 8. advertencia objc: "descartar clasificados de puntero del tipo de destino"
- 9. declaración directa con el vector del tipo de clase - puntero al tipo de clase incompleto no permitido
- 10. uso no válido del tipo incompleto
- 11. "El puntero del bloque al tipo sin función no es válido"
- 12. ¿Por qué es un puntero
- 13. yacc - campo tiene tipo incompleto
- 14. ¿Por qué ID es un puntero genérico?
- 15. Campo estático de un tipo incompleto: ¿es legal?
- 16. ¿Por qué aparece una advertencia del compilador cuando uso ContinueWith?
- 17. ¿Por qué hay una eliminación [] en C++?
- 18. ¿Por qué sizeof (param_array) es el tamaño del puntero?
- 19. ¿Qué está haciendo VC++ al empacar bitfields?
- 20. ¿Por qué un puntero a un puntero es incompatible con un puntero a una matriz?
- 21. Sintaxis del puntero en C: ¿por qué * solo se aplica a la primera variable?
- 22. Eliminar objetos de tipo incompleto
- 23. INFILE tipo incompleto de error
- 24. advertencia: asignación descarta calificadores de tipo de destino puntero
- 25. "desreferencia puntero tipo punteado romperá reglas de alias estricto" advertencia
- 26. ¿Por qué recibo la advertencia "LoaderLock was detected" al depurar?
- 27. ¿Qué es un puntero largo?
- 28. No puedo obtener acceso al puntero al miembro. ¿Por qué?
- 29. ¿Qué es intptr_t, es un tipo para entero o puntero?
- 30. Error de C++: uso no válido del tipo incompleto ...
... lo que significa que cuando el destructor del tipo es trivial, es legal. Como el compilador no conoce el tipo, no sabe si el destructor es trivial o no, y no puede decidir si el comportamiento es indefinido o no. – Suma