Por que o destruidor desativa a geração de métodos de movimentação implícitos?
Eu estava tentando entender o que a regra do zero diz lendoeste blog. Na IMO, ele diz que se você declarar seu próprio destruidor, não esqueça de fazer o construtor de movimentação e a atribuição de movimentação como padrão.
class Widget {
public:
~Widget(); // temporary destructor
... // no copy or move functions
};
"A adição do destruidor tem o efeito colateral de desativar a geração das funções de movimentação, mas como o Widget é copiável, todo o código usado para gerar movimentos agora gera cópias. Em outras palavras, a adição de um destruidor à classe causou presumivelmente movimentos eficientes a serem substituídos silenciosamente por cópias presumivelmente menos eficientes ".
O texto acima de Scott Meyers, dentro das citações, levanta algumas questões em minha mente:
Por que declarar destruidor oculta a semântica da movimentação?O destruidor declarar / definir apenas oculta a semântica da movimentação ou o construtor de cópias e a atribuição de cópias também oculta a semântica da movimentação?