Maison >développement back-end >C++ >Comment les fonctions supprimées dans C 11 influencent-elles la résolution de surcharge ?

Comment les fonctions supprimées dans C 11 influencent-elles la résolution de surcharge ?

Mary-Kate Olsen
Mary-Kate Olsenoriginal
2024-12-15 15:22:24446parcourir

How Do Deleted Functions in C  11 Influence Overload Resolution?

Résolution de surcharge en C 11 avec fonctions supprimées

C 11 permet l'utilisation de la syntaxe = delete pour marquer les fonctions comme "supprimées". " Cette syntaxe empêche le compilateur de générer le corps de la fonction et interdit son invocation directe. Cependant, ces fonctions supprimées participent toujours à la résolution de surcharge, un processus qui détermine la fonction la plus appropriée à appeler en fonction d'un ensemble de paramètres d'entrée.

Pourquoi cette fonctionnalité est-elle utile ? Pourquoi les fonctions supprimées sont-elles masquées au lieu d'être complètement supprimées du code ?

La raison principale est de désactiver des surcharges spécifiques en fonction des types de paramètres. En participant à la résolution des surcharges, les fonctions supprimées empêchent les conversions implicites qui pourraient conduire à un comportement involontaire. Prenons l'exemple suivant :

struct onlydouble {
  onlydouble(std::intmax_t) = delete;
  onlydouble(double);
};

Si delete supprimait entièrement la fonction, la syntaxe = delete serait effectivement équivalente à :

struct onlydouble2 {
  onlydouble2(double);
};

Avec ce changement, le code suivant serait légal :

onlydouble2 val(20);

Le compilateur tenterait de convertir implicitement le littéral entier 20 en double avant d'invoquer le constructeur qui prend un double.

En revanche, dans l'exemple original avec le constructeur supprimé, le compilateur détecterait une correspondance exacte entre les paramètres de la fonction (std::intmax_t) et l'argument (20). Il générerait alors une erreur car il a sélectionné une fonction supprimée pour l'invocation.

La syntaxe = delete permet donc un contrôle plus fort sur les fonctions qui sont appelées en fonction des types de paramètres. Il empêche les conversions implicites qui pourraient entraîner des conséquences inattendues.

De plus, le concept « cela n'existe pas » n'est pas nécessaire dans la spécification C car :

  • Une grammaire spéciale existe pour suppression de fonctions ("J'interdis cela")
  • Des fonctions implicitement définies (par exemple, un constructeur de copie) existent par par défaut
  • La résolution de surcharge gère "l'existence" de la fonction en identifiant les discordances ou les ambiguïtés
  • L'objectif principal des fonctions supprimées est de contrôler la résolution de surcharge, plutôt que d'indiquer la non-existence

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn