"Se um trabalhador quiser fazer bem o seu trabalho, ele deve primeiro afiar suas ferramentas." - Confúcio, "Os Analectos de Confúcio. Lu Linggong"
Primeira página > Programação > Quando os construtores de movimentação e os operadores de atribuição de movimentação são gerados automaticamente em C++ 11?

Quando os construtores de movimentação e os operadores de atribuição de movimentação são gerados automaticamente em C++ 11?

Publicado em 2024-12-26
Navegar:179

When Are Move Constructors and Move Assignment Operators Automatically Generated in C  11?

Geração automática de operações de movimentação

Em C 11, a introdução da semântica de movimentação levantou questões sobre as circunstâncias sob as quais move construtores e move atribuição operadores são gerados automaticamente.

Em C 11, as operações de movimentação não são geradas automaticamente como construtores de cópia e operadores de atribuição de cópia. O compilador só gera semântica de movimentação se certas condições forem atendidas:

  • Não existe nenhum construtor de cópia definido pelo usuário ou operador de atribuição de cópia. Se algum desses membros for definido explicitamente, nenhuma movimentação operações são geradas.
  • Nenhum destruidor definido pelo usuário é definido. Definir um destruidor desativa a geração de movimento semântica.
  • A classe não tem membros não copiáveis. As operações de movimentação não serão geradas se a classe contiver membros que não possam ser movidos, como ponteiros para memória alocada dinamicamente.

A compreensão dessas regras ajuda a orientar a implementação de classes que utilizam a semântica de movimentação. A tabela da apresentação de Howard Hinnant fornece uma visão geral concisa da geração automática de membros especiais, incluindo operações de movimentação:

DeclaraçãoCopy ConstructorOperador de atribuição de cópiaMove Construtor e Move Assignment Operador
NenhumGeradoGeradoNão gerado
Construtor de cópiaNão geradoGeradoNão Gerado
Operador de atribuição de cópiaNão geradoNão geradoNão gerado
Move ConstrutorNão geradoNão geradoNão Gerado
Move Operador de AtribuiçãoNão GeradoNão GeradoNão Gerado
DestruidorNão geradoNão geradoNão Gerado
Construtor de cópia e operador de atribuição de cópiaNão geradoNão geradoNão gerado
Construtor de cópia e construtor de movimentoNão geradoNão GeradoNão gerado
Construtor de cópia e operador de atribuição de movimentaçãoNão geradoNão geradoNão Gerado
Copiar operador de atribuição e construtor de movimentaçãoNão GeradoNão geradoNão gerado
Copiar operador de atribuição e mover operador de atribuiçãoNão gerado Não geradoNão gerado
Move Construtor & DestruidorNão geradoNão geradoNão gerado
Move operador de atribuição e destruidorNão gerado Não geradoNão Gerado
Construtor de cópia e operador de atribuição de cópia e construtor de movimentoNão geradoNão geradoNão gerado
Construtor de cópia e operador de atribuição de cópia e operador de atribuição de movimentoNão GeradoNão geradoNão gerado
Copiar construtor e mover construtor e mover operador de atribuiçãoNão geradoNão geradoGerado
Copiar operador de atribuição e mover Construtor e operador de atribuição de movimentaçãoNão geradoNão geradoGerado

Ao reconhecer essas regras, os desenvolvedores podem garantir que suas classes utilizem adequadamente a semântica de movimentação e alcancem a eficiência ideal.

Tutorial mais recente Mais>

Isenção de responsabilidade: Todos os recursos fornecidos são parcialmente provenientes da Internet. Se houver qualquer violação de seus direitos autorais ou outros direitos e interesses, explique os motivos detalhados e forneça prova de direitos autorais ou direitos e interesses e envie-a para o e-mail: [email protected]. Nós cuidaremos disso para você o mais rápido possível.

Copyright© 2022 湘ICP备2022001581号-3