A "solução" GotW # 101 realmente resolve alguma coisa?

eia primeiro os posts de Herb's Sutters GotW sobre pimpl em C ++ 11:

Gotot # 100: Firewalls de compilação (dificuldade: 6/10)

Gotot # 101: Firewalls de compilação, parte 2 (dificuldade: 8/10)

Estou tendo problemas para entender a solução proposta na GotW # 101. Tanto quanto eu posso entender, todos os problemas laboriosamente resolvidos na GotW # 100 estão de volta com uma vingança:

Opimpls membros @ são modelos fora de linha e as definições não são visíveis no ponto de uso (emclass widgetefinição de classe de @ e funções-membro especiais geradas implicitamente dewidget). Também não existem instâncias explícitas. Isso causará erros externos não resolvidos durante a vinculação.

widget::impl ainda está incompleto no ponto em quepimpl<widget::impl>::~pimpl() é instanciado definido (não acho que seja realmente instanciado, apenas referenciado). Entãostd::unique_ptr<widget::impl>::~unique_ptr() callsdelete em um ponteiro para o tipo incompleto, que produz um comportamento indefinido sewidget::impl possui um destruidor não trivial.

Explique o que força o compilador a gerar os membros especiais em um contexto em quewidget::impl está completo. Porque não consigo ver como isso funciona.

Se GotW # 101 ainda exigir definição explícita dewidget::~widget() no arquivo de implementação, em quewidget::impl está completo, então explique o comentário "Mais robusto" (que @ citado em sua resposta

Estou analisando a alegação central do GotW # 101 de que o invólucro "elimina alguns pedaços de clichê", o que me parece (com base no restante do parágrafo) significar owidget::~widget() declaração e definição. Então, por favor, não conte com isso na sua resposta, na GotW # 101, acabou!

Herb, se você parar por favor, deixe-me saber se seria bom cortar + colar o código da solução aqui para referência.

questionAnswers(2)

yourAnswerToTheQuestion