¿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:

Lospimplos miembros @ son plantillas fuera de línea y las definiciones no son visibles en el punto de uso (enclass widgeta 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.

Respuestas a la pregunta(4)

Su respuesta a la pregunta