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:
Opimpl
s membros @ são modelos fora de linha e as definições não são visíveis no ponto de uso (emclass widget
efiniçã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.