¿La "solución" GotW # 101 realmente resuelve algo?
Primero lea las publicaciones de Herb's Sutters GotW sobre pimpl en C ++ 11:
GotW # 100: Cortafuegos de compilación (Dificultad: 6/10)
GotW # 101: Cortafuegos de compilación, Parte 2 (Dificultad: 8/10)
Tengo problemas para entender la solución propuesta en GotW # 101. Hasta donde puedo entender, todos los problemas resueltos laboriosamente en GotW # 100 están de vuelta con una venganza:
Lospimpl
os miembros @ son plantillas fuera de línea y las definiciones no son visibles en el punto de uso (enclass widget
a definición de clase de @ y las funciones miembro especiales generadas implícitamente dewidget
). Tampoco hay instancias explícitas. Esto provocará errores externos no resueltos durante el enlace.
widget::impl
todavía está incompleto en el punto dondepimpl<widget::impl>::~pimpl()
es instanciado definido (no creo que en realidad ES instanciado en absoluto, solo referenciado). Entoncesstd::unique_ptr<widget::impl>::~unique_ptr()
llamadasdelete
en un puntero a tipo incompleto, que produce un comportamiento indefinido siwidget::impl
tiene un destructor no trivial.
Por favor, explique qué obliga al compilador a generar los miembros especiales en un contexto dondewidget::impl
Esta completo. Porque no puedo ver cómo funciona esto.
Si GotW # 101 todavía requiere una definición explícita dewidget::~widget()
en el archivo de implementación, dondewidget::impl
está completo, luego explique el comentario "Más robusto" (que @sehe citó en su respuesta).
Estoy viendo el reclamo central de GotW # 101 de que el envoltorio "elimina algunas piezas repetitivas", lo que me parece (según el resto del párrafo) que significa elwidget::~widget()
declaración y definición. ¡Así que no confíes en eso en tu respuesta, en GotW # 101, eso se ha ido!
Herb, si pasa por aquí, avíseme si estaría bien cortar y pegar el código de la solución aquí como referencia.