princípios fundamentais C ++ C.22: manter a consistência do padrão de acção

C.22: operações Tornar padrão consistente

C.22: Manter a consistência operacional padrão


Razão (razão)

As operações padrão são conceitualmente um conjunto combinado. Sua semântica estão inter-relacionados. Os usuários serão surpreendidos se cópia construção / movimento e atribuição copiar / mover as coisas logicamente diferentes. Os usuários serão surpreendidos se construtores e destruidores não fornecem uma visão consistente de gestão de recursos. Os usuários serão surpreendidos se copiar e mover não refletem a maneira como construtores e destruidores de trabalho.

A ação padrão está em linha com um rigoroso conjunto de processo conceitualmente. Sua semântica estão inter-relacionados. Se a cópia / movimento é configurado e copiar / mover atribuição fazer é logicamente coisas diferentes, o usuário será surpreendido; Se o construtor e destruidor não fornece consistente com a idéia de gestão de recursos, o usuário ficaria surpreso; se as operações de cópia e mover operação construtor e destruidor não correspondente, o utilizador será surpreendido.


Exemplo, mau (amostra negativa)

class Silly {   // BAD: Inconsistent copy operations
    class Impl {
        // ...
    };
    shared_ptr<Impl> p;
public:
    Silly(const Silly& a) : p{a.p} { *p = *a.p; }   // deep copy
    Silly& operator=(const Silly& a) { p = a.p; }   // shallow copy
    // ...
};

Estas operações discordam sobre cópia semântica. Isto levará a confusão e erros.

Estas operações (construtor de cópia e atribuição) em diferentes semântica de cópia (o vento não é cópia profunda e cópia superficial). Isso pode levar a confusão e erros.


Enforcement (Sugestões)

  • (Complex) Uma cópia / construtor movimento ea correspondente copiar / mover operador de atribuição deve escrever para as mesmas variáveis ​​de membro no mesmo nível de dereference.

     

    (Complex) para copiar / mover o construtor correspondente e copiar / operador de atribuição deve se mover para o mesmo nível de escrever a mesma variável de membro dereferencing.

  • (Complexo) Quaisquer variáveis ​​de membro escritos em um construtor de copiar / mover também deve ser inicializado por todos os outros construtores.

    (Complexo) qualquer variável membro escrito no construtor de cópia / movimento deve ser inicializado construtores adicionais.

  • (Complex) Se um construtor copiar / mover executa uma cópia profunda de uma variável de membro, então o destrutor deve modificar a variável de membro.

    (Complex) se a copiar / mover o membro variáveis ​​construtor de cópia profunda, então o destrutor deve modificar a variável de membro.

  • (Complexo) Se um processo de destruição é a modificação de um membro variável, que variável de membro deveria ser escrito em qualquer cópia construtores / mover ou operadores de atribuição.

  • (Complexo), se o processo de destruição modificar uma variável de membro, então a variável membro deve ser escrito na cópia / construtor movimento ou atribuição operador.

 

link original:

https://github.com/isocpp/CppCoreGuidelines/blob/master/CppCoreGuidelines.md#c22-make-default-operations-consistent

 


 

Acho que este artigo útil? polegares bem-vindo para cima e compartilhá-lo com mais pessoas.

Leia artigos mais atualizados, por favor, preste atenção para micro-channel número público do pensamento orientado a objeto []

Publicado 408 artigos originais · Louvor obteve 653 · vista 290 000 +

Acho que você gosta

Origin blog.csdn.net/craftsman1970/article/details/104282899
Recomendado
Clasificación