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 []