class my_class
{
...
my_class(my_class const &) = delete;
...
};
O que = delete
significa nesse contexto?
Existem outros "modificadores" (exceto = 0
e = delete
)?
c++
function
c++11
declaration
delete-operator
Pat O'Keefe
fonte
fonte
#define
a la Qt que foi avaliado como 0 e depois declarou uma função oculta ou algo assim.Respostas:
A exclusão de uma função é um recurso do C ++ 11 :
fonte
=delete
torna o método inacessível mesmo em contextos que podem verprivate
métodos (ou seja, dentro da classe e de seus amigos). Isso remove qualquer incerteza quando você está lendo o código. @Paroon, esse segundo exemplo ainda está excluindo apenas os construtores - seria bom ver um excluído,operator long ()
por exemplo.= delete
é melhor do que usarprivate
ou outros mecanismos similares, porque geralmente você deseja que a função proibida seja visivelmente declarada e considerada para resolução de sobrecarga, etc., para que ela possa falhar o mais cedo possível e fornecer o erro mais claro ao usuário. Qualquer solução que envolva "ocultar" a declaração reduz esse efeito.= 0
significa que uma função é virtual pura e você não pode instanciar um objeto dessa classe. Você precisa derivar dele e implementar esse método= delete
significa que o compilador não irá gerar esses construtores para você. AFAIK, isso é permitido apenas no construtor de cópias e no operador de atribuição. Mas não sou muito bom no próximo padrão.fonte
=delete
sintaxe. Por exemplo, você pode usá-lo para proibir explicitamente algum tipo de conversão implícita que pode ocorrer com a chamada. Para isso, você apenas exclui as funções sobrecarregadas. Dê uma olhada na página da Wikipedia em C ++ 0x para obter mais informações.= delete
não está totalmente correta.= delete
pode ser usado para qualquer função; nesse caso, é explicitamente marcado como excluído e qualquer uso resulta em um erro do compilador. Para funções-membro especiais, isso também significa, em particular, que elas não são geradas para você pelo compilador, mas isso é apenas o resultado de serem excluídas, e não o que= delete
realmente é.Este trecho do livro The C ++ Programming Language [4th Edition] - Bjarne Stroustrup fala sobre o real objetivo por trás do uso de
=delete
:fonte
Como parece que ninguém mais respondeu a essa pergunta, devo mencionar que também existe
=default
.https://docs.microsoft.com/pt-br/cpp/cpp/explicitly-defaulted-and-deleted-functions#explicitly-defaulted-functions
fonte
Os padrões de codificação com os quais trabalhei tiveram o seguinte na maioria das declarações de classe.
Se você usar qualquer um desses 6, basta comentar a linha correspondente.
Exemplo: a classe FizzBus requer apenas dtor e, portanto, não usa os outros 5.
Comentamos apenas 1 aqui e instalamos a implementação em outro local (provavelmente onde o padrão de codificação sugere). Os outros 5 (de 6) não são permitidos com exclusão.
Você também pode usar '= delete' para não permitir promoções implícitas de valores de tamanhos diferentes ... exemplo
fonte
= delete
é um recurso introduzido no C ++ 11. Conforme=delete
não será permitido chamar essa função.Em detalhe.
Suponha em uma classe.
Ao chamar esta função para atribuição de obj, não será permitido. Significa que o operador de atribuição restringirá a cópia de um objeto para outro.
fonte
Novo padrão C ++ 0x. Consulte a seção 8.4.3 no rascunho de trabalho do N3242
fonte
Uma função excluída está implicitamente embutida
(Adenda às respostas existentes)
... E uma função excluída deve ser a primeira declaração da função (exceto para excluir especializações explícitas de modelos de função - a exclusão deve estar na primeira declaração da especialização), o que significa que você não pode declarar uma função e depois excluí-la, por exemplo, na sua definição local para uma unidade de tradução.
Citando [dcl.fct.def.delete] / 4 :
Um modelo de função principal com uma definição excluída pode ser especializado
Embora uma regra geral geral seja evitar a especialização de modelos de função, uma vez que as especializações não participam da primeira etapa da resolução de sobrecarga, existem alguns contextos discutíveis em que isso pode ser útil. Por exemplo, ao usar um modelo de função principal não sobrecarregado sem definição para corresponder a todos os tipos que não seria implicitamente convertido em uma sobrecarga correspondente por conversão; ou seja, remover implicitamente várias correspondências implícitas de conversão implementando apenas correspondências exatas de tipo na especialização explícita do modelo de função principal não definido e não sobrecarregado.
Antes do conceito de função excluída do C ++ 11, era possível simplesmente omitir a definição do modelo de função principal, mas isso gerava erros de referência indefinidos obscuros que, sem dúvida, não deram nenhuma intenção semântica ao autor do modelo de função primária (omitido intencionalmente) ?). Se, em vez disso, excluirmos explicitamente o modelo de função principal, as mensagens de erro, caso não seja encontrada nenhuma especialização explícita adequada, ficarão muito mais agradáveis e também mostrarão que a omissão / exclusão da definição do modelo de função principal foi intencional.
No entanto, em vez de simplesmente omitir uma definição para o modelo de função principal acima, produzindo um erro de referência indefinido obscuro quando nenhuma especialização explícita corresponder, a definição do modelo primário pode ser excluída:
Apresentando uma mensagem de erro mais legível, em que a intenção de exclusão também é claramente visível (onde um erro de referência indefinido pode levar o desenvolvedor a pensar que isso é um erro imprudente).
Voltando ao motivo de querermos usar essa técnica? Mais uma vez, especializações explícitas poderiam ser úteis para implicitamente remover conversões implícitas.
fonte
Isso é algo novo nos padrões C ++ 0x, onde você pode excluir uma função herdada.
fonte
void foo(int); template <class T> void foo(T) = delete;
interrompe todas as conversões implícitas. Somente argumentos doint
tipo são aceitos, todos os outros tentarão instanciar uma função "excluída".