Rascunho padrão C ++ 17 N4659
Para uma referência rápida entre padrões, consulte as seções "Declaradas implicitamente" das seguintes entradas de preferência:
Naturalmente, a mesma informação pode ser obtida no padrão. Por exemplo, em rascunho padrão C ++ 17 N4659 :
15.8.1 "Copiar / mover construtores" diz para o construtor de cópias:
6 Se a definição de classe não declarar explicitamente um construtor de cópia, um não-explícito será declarado implicitamente. Se a definição de classe declara um construtor de movimentação ou um operador de atribuição de movimentação, o construtor de cópia declarado implicitamente é definido como excluído; caso contrário, é definido como padrão (11.4). O último caso será preterido se a classe tiver um operador de atribuição de cópia declarada pelo usuário ou um destruidor declarado pelo usuário.
e para mover construtor:
8 Se a definição de uma classe X não declarar explicitamente um construtor de movimento, um não explícito será implicitamente declarado como padrão se e somente se
(8.1) - X não possui um construtor de cópias declarado pelo usuário,
(8.2) - X não possui um operador de atribuição de cópia declarado pelo usuário,
(8.3) - X não possui um operador de atribuição de movimentação declarado pelo usuário e
(8.4) - X não possui um destruidor declarado pelo usuário.
15.8.2 "Copiar / mover operador de atribuição" diz para atribuição de cópia:
2 Se a definição de classe não declarar explicitamente um operador de atribuição de cópia, um será declarado implicitamente. Se a definição de classe declara um construtor de movimentação ou um operador de atribuição de movimentação, o operador de atribuição de cópia declarado implicitamente é definido como excluído; caso contrário, é definido como padrão (11.4). O último caso será descontinuado se a classe tiver um construtor de cópias declarado pelo usuário ou um destruidor declarado pelo usuário.
e para atribuição de movimento:
4 Se a definição de uma classe X não declarar explicitamente um operador de atribuição de movimentação, um será implicitamente declarado como padrão se e somente se
- (4.1) - X não possui um construtor de cópias declarado pelo usuário,
- (4.2) - X não possui um construtor de movimentação declarado pelo usuário,
- (4.3) - X não possui um operador de atribuição de cópia declarado pelo usuário e
- (4.4) - X não possui um destruidor declarado pelo usuário.
15.4 "Destruidores" diz isso para destruidores:
4 Se uma classe não tiver um destruidor declarado pelo usuário, um destruidor é declarado implicitamente como padrão (11.4). Um destruidor implicitamente declarado é um membro público interno de sua classe.