class my_class
{
...
my_class(my_class const &) = delete;
...
};
Que = delete
signifie dans ce contexte?
Y a-t-il d'autres "modificateurs" (autres que = 0
et = delete
)?
c++
function
c++11
declaration
delete-operator
Pat O'Keefe
la source
la source
#define
a la Qt évalué à 0 puis déclaré une fonction cachée ou quelque chose.Réponses:
La suppression d'une fonction est une fonctionnalité C ++ 11 :
la source
=delete
rend la méthode inaccessible même à partir de contextes qui peuvent voir lesprivate
méthodes (c'est-à-dire au sein de la classe et de ses amis). Cela supprime toute incertitude lorsque vous lisez le code. @Prasoon, ce deuxième exemple supprime toujours les constructeurs - ce serait bien de voir un suppriméoperator long ()
par exemple.= delete
est préférable à l'utilisationprivate
ou à d'autres mécanismes similaires, car vous voulez généralement que la fonction interdite soit déclarée visiblement et prise en compte pour la résolution de surcharge, etc., afin qu'elle puisse échouer le plus tôt possible et fournir l'erreur la plus claire à l'utilisateur. Toute solution qui consiste à «masquer» la déclaration réduit cet effet.= 0
signifie qu'une fonction est pure virtuelle et que vous ne pouvez pas instancier un objet de cette classe. Vous devez en dériver et implémenter cette méthode= delete
signifie que le compilateur ne générera pas ces constructeurs pour vous. AFAIK ceci n'est autorisé que sur le constructeur de copie et l'opérateur d'affectation. Mais je ne suis pas trop bon pour la prochaine norme.la source
=delete
syntaxe. Par exemple, vous pouvez l'utiliser pour interdire explicitement certains types de conversions implicites qui pourraient avoir lieu avec l'appel. Pour cela, vous supprimez simplement les fonctions surchargées. Jetez un œil à la page Wikipedia sur C ++ 0x pour plus d'informations.= delete
n'est pas entièrement correcte.= delete
peut être utilisé pour n'importe quelle fonction, auquel cas il est explicitement marqué comme supprimé et toute utilisation entraîne une erreur de compilation. Pour les fonctions membres spéciales, cela signifie également en particulier qu'elles ne sont alors pas générées pour vous par le compilateur, mais ce n'est que le résultat de leur suppression, et non ce qui= delete
est vraiment.Cet extrait du langage de programmation C ++ [4e édition] - Le livre de Bjarne Stroustrup parle du véritable objectif de l'utilisation
=delete
:la source
Puisqu'il semble que personne d'autre n'ait répondu à cette question, je dois mentionner qu'il y en a aussi
=default
.https://docs.microsoft.com/en-us/cpp/cpp/explicitly-defaulted-and-deleted-functions#explicitly-defaulted-functions
la source
Les normes de codage avec lesquelles j'ai travaillé ont eu les éléments suivants pour la plupart des déclarations de classe.
Si vous utilisez l'un de ces 6, il vous suffit de commenter la ligne correspondante.
Exemple: la classe FizzBus ne nécessite que dtor, et donc n'utilise pas les 5 autres.
Nous commentons seulement 1 ici et installons l'implémentation de celui-ci ailleurs (probablement là où la norme de codage le suggère). Les 5 autres (sur 6) sont interdits de suppression.
Vous pouvez également utiliser '= supprimer' pour interdire les promotions implicites de valeurs de tailles différentes ... exemple
la source
= delete
est une fonctionnalité introduite en C ++ 11. Selon,=delete
il ne sera pas autorisé à appeler cette fonction.En détail.
Supposons que dans une classe.
Lors de l'appel de cette fonction pour l'affectation d'obj, elle ne sera pas autorisée. L'opérateur d'affectation de moyens va restreindre la copie d'un objet à un autre.
la source
Nouveau standard C ++ 0x. Veuillez consulter la section 8.4.3 du projet de travail N3242
la source
Une fonction supprimée est implicitement en ligne
(Addendum aux réponses existantes)
... Et une fonction supprimée doit être la première déclaration de la fonction (sauf pour la suppression de spécialisations explicites de modèles de fonction - la suppression doit se faire à la première déclaration de la spécialisation), ce qui signifie que vous ne pouvez pas déclarer une fonction et la supprimer plus tard, par exemple, à sa définition locale à une unité de traduction.
Citant [dcl.fct.def.delete] / 4 :
Un modèle de fonction principale avec une définition supprimée peut être spécialisé
Bien qu'une règle générale soit d'éviter la spécialisation des modèles de fonction car les spécialisations ne participent pas à la première étape de la résolution des surcharges, il existe certains contextes où cela peut être utile. Par exemple, lors de l'utilisation d'un modèle de fonction principale non surchargé sans définition pour correspondre à tous les types que l'on ne voudrait pas implicitement convertis en une surcharge par correspondance par conversion; c'est-à-dire pour supprimer implicitement un certain nombre de correspondances de conversion implicite en implémentant uniquement des correspondances de type exact dans la spécialisation explicite du modèle de fonction principale non défini et non surchargé.
Avant le concept de fonction supprimé de C ++ 11, on pouvait le faire en omettant simplement la définition du modèle de fonction principale, mais cela donnait des erreurs de référence indéfinies obscures qui sans doute ne donnaient aucune intention sémantique de l'auteur du modèle de fonction primaire (intentionnellement omis ?). Si au lieu de cela, nous supprimons explicitement le modèle de fonction principale, les messages d'erreur au cas où aucune spécialisation explicite appropriée ne serait trouvée deviennent beaucoup plus agréables et montrent également que l'omission / la suppression de la définition du modèle de fonction principale était intentionnelle.
Cependant, au lieu d'omettre simplement une définition du modèle de fonction principal ci-dessus, ce qui génère une erreur de référence obscure non définie lorsqu'aucune spécialisation explicite ne correspond, la définition du modèle principal peut être supprimée:
Donner un message d'erreur plus lisible, où l'intention de suppression est également clairement visible (où une erreur de référence non définie pourrait conduire le développeur à penser que c'est une erreur irréfléchie).
Revenons à pourquoi voudrions-nous jamais utiliser cette technique? Encore une fois, des spécialisations explicites pourraient être utiles pour implicitement supprimer les conversions implicites.
la source
C'est une nouveauté dans les normes C ++ 0x où vous pouvez supprimer une fonction héritée.
la source
void foo(int); template <class T> void foo(T) = delete;
arrête toutes les conversions implicites. Seuls les arguments deint
type sont acceptés, tous les autres tenteront d'instancier une fonction "supprimée".